【问题标题】:FileProvider.getUriForFile context throwing NullPointer exeptionFileProvider.getUriForFile 上下文抛出空指针异常
【发布时间】:2018-11-06 17:08:58
【问题描述】:

我从FileProvider.getUriForFile 收到以下错误

java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“android.content.res.Resources android.content.Context.getResource()”

但是,当我显示 context.toString() 时,我得到了这个(我认为)证明该对象不为空:

uk.co.letsdelight.letsdelight.MainActivity@8eec139

代码将Completed download of update file 写入logcat,但不会在API 24 设备上写入URI successfully set。它适用于 API 23。这是代码的重要部分。 Update 类从 MainActivitynew Update(status, message).check(this); 调用

public class Update extends Activity {

    private File outputFile;
    private TextView status;
    private TextView message;
    private String TAG = "LETSDELIGHT";

    public Update(TextView status){
        this.status = status;
    }
    public Update(TextView status, TextView message){
        this.status  = status;
        this.message = message;
    }

    public void check(final Context c) {
        status.setText("Checking for updates");

        // Check for updates and give user option to update

            // UPDATE button pressed
            UpdateApp updateApp = new UpdateApp();
            updateApp.setContext(c);
            updateApp.execute(c.getString(R.string.apk_uri));
            status.setText("Downloading update");
    }

    public class UpdateApp extends AsyncTask<String,Void,Void> {
        private Context context;
        private Throwable thrown = null;
        private String statusMessage;
        public void setContext(Context contextf){
            context = contextf;
        }

        @Override
        protected Void doInBackground(String... arg0) {
            try {
                URL url = new URL(arg0[0]);
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                conn.setRequestMethod("GET");
                conn.setDoOutput(true);
                conn.connect();

                Log.i(TAG,"Starting download of update file");
                statusMessage = "Starting download of update file";

                File file = context.getCacheDir();
                file.mkdirs();
                outputFile = new File(file, "update.apk");
                if(outputFile.exists()){
                    outputFile.delete();
                }
                FileOutputStream fos = new FileOutputStream(outputFile);

                InputStream is = conn.getInputStream();

                byte[] buffer = new byte[1024];
                int len1 = 0;
                while ((len1 = is.read(buffer)) != -1) {
                    fos.write(buffer, 0, len1);
                }
                fos.close();
                is.close();
                outputFile.setReadable(true, false);

                Log.i(TAG, "Completed download of update file");
                statusMessage = "Completed download of update file";

                Uri uri;
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                    uri = FileProvider.getUriForFile(context, getString(R.string.file_provider_authority), outputFile);
                } else {
                    uri = Uri.fromFile(outputFile);
                }

                Log.i(TAG, "URI successfully set");
                statusMessage = "URI successfully set";

                Intent intent = new Intent(Intent.ACTION_VIEW);
                intent.setDataAndType(uri, "application/vnd.android.package-archive");
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(intent);

            } catch (Throwable ex) {
                Log.e(TAG, ex.toString());
                thrown = ex;
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void v) {
            status.setText("");
            if (statusMessage != null) {
                status.setText(statusMessage);
            }
            if (thrown != null) {
                status.setText(context.toString());
                message.setText(thrown.toString());
            }
            outputFile.delete();
            super.onPostExecute(v);
        }
    }
}

AndroidManifest.xml 文件包含以下条目:

    <provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="@strings/file_provider_authority"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_provider_paths" />
    </provider>

file_provider_paths.xml 看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <cache-path name="cache" path="."/>
</paths>

我尝试将context 更改为getApplication()getApplicationContext(),这两者都会导致NullPointerException,但资源措辞略有不同。

我还能尝试什么来解决这个问题?

编辑:

我已经修改了代码,试图找出问题的根源:

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                statusMessage = "Context is: " + context.getString(R.string.file_provider_authority);
                uri = FileProvider.getUriForFile(context, context.getString(R.string.file_provider_authority), outputFile);
                statusMessage = "uri set";
            } else {
                uri = Uri.fromFile(outputFile);
            }

statusMessage 设置为显示正确的提供者权限字符串。它没有设置为“uri set”。因此,肯定是 FileProvider.getUriForFile() 失败了。

鉴于context 不为空且Authority 是正确的字符串,还有什么可能在这里抛出错误?

【问题讨论】:

    标签: java android android-fileprovider


    【解决方案1】:

    您正在尝试在非活动类中调用 getString 尝试替换

    getString(R.string.file_provider_authority)
    

    context.getString(R.string.file_provider_authority)
    

    编辑:我看到您正在扩展您的 Update 类中的活动,您是否在清单中声明了它?如果您已经在传递上下文,为什么还要扩展活动?

    【讨论】:

    • 关于扩展Activity 和传递context 的好点 - 它的出现是因为在某些时候需要对MainActivity 的引用。我现在删除了extends Activity 并使用了context.getString(R.string.file_provider_authority),这会引发不同的错误:> java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.XmlParser android.content.pm.ProviderInfo.loadXmlMetaData(android.content .pm.PackageManager.java.lang.String)' 在空对象引用上
    • 我现在添加了一个检查,确认context.getString(R.string.file_provider_authority) 工作正常,所以问题是别的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-22
    • 2020-08-10
    • 2013-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多