在内部存储上共享文件时,在其他应用程序中出现NullPointerException

时间:2014-02-26 22:59:55

标签: android android-intent android-contentprovider

在我们的应用程序中,我们发现有必要通过对另一个应用程序的意图从我们的内部存储打开文档。即打开一个pdf,我们已在内部存储在用户的默认pdf阅读器中。

在清单中,我将应用程序设置为提供程序,在我们的Provider类中,我实现了被调用的openFile(Uri uri,String模式)方法,并且不会抛出FileNotFoundException。

我已经验证该文件存在于预期的位置 - 并且intent不为null,实际上看起来是正确的。

但是,当我发送新的Intent时,试图打开文件的应用程序会因NPE而死亡。例如,这是尝试打开PDF时的堆栈跟踪:

02-26 14:53:59.047: E/AndroidRuntime(4138): FATAL EXCEPTION: main
02-26 14:53:59.047: E/AndroidRuntime(4138): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.tf.thinkdroid.sg/com.tf.thinkdroid.pdf.app.RenderScreen}: java.lang.NullPointerException
02-26 14:53:59.047: E/AndroidRuntime(4138):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
02-26 14:53:59.047: E/AndroidRuntime(4138):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
02-26 14:53:59.047: E/AndroidRuntime(4138):     at android.app.ActivityThread.access$600(ActivityThread.java:130)
02-26 14:53:59.047: E/AndroidRuntime(4138):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
02-26 14:53:59.047: E/AndroidRuntime(4138):     at android.os.Handler.dispatchMessage(Handler.java:99)
02-26 14:53:59.047: E/AndroidRuntime(4138):     at android.os.Looper.loop(Looper.java:137)
02-26 14:53:59.047: E/AndroidRuntime(4138):     at android.app.ActivityThread.main(ActivityThread.java:4745)
02-26 14:53:59.047: E/AndroidRuntime(4138):     at java.lang.reflect.Method.invokeNative(Native Method)
02-26 14:53:59.047: E/AndroidRuntime(4138):     at java.lang.reflect.Method.invoke(Method.java:511)
02-26 14:53:59.047: E/AndroidRuntime(4138):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
02-26 14:53:59.047: E/AndroidRuntime(4138):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
02-26 14:53:59.047: E/AndroidRuntime(4138):     at dalvik.system.NativeStart.main(Native Method)
02-26 14:53:59.047: E/AndroidRuntime(4138): Caused by: java.lang.NullPointerException
02-26 14:53:59.047: E/AndroidRuntime(4138):     at com.tf.thinkdroid.pdf.app.RenderScreen.onNewIntent(Unknown Source)
02-26 14:53:59.047: E/AndroidRuntime(4138):     at com.tf.thinkdroid.pdf.app.RenderScreen.onCreate(Unknown Source)
02-26 14:53:59.047: E/AndroidRuntime(4138):     at android.app.Activity.performCreate(Activity.java:5008)
02-26 14:53:59.047: E/AndroidRuntime(4138):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
02-26 14:53:59.047: E/AndroidRuntime(4138):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
02-26 14:53:59.047: E/AndroidRuntime(4138):     ... 11 more
02-26 14:53:59.054: W/ActivityManager(251):   Force finishing activity com.tf.thinkdroid.sg/com.tf.thinkdroid.pdf.app.RenderScreen

我无法想到任何调试方法,因为它发生在我的应用程序之外,我只是不确定为什么会发生这种情况。是否有人对可能导致此问题的原因或如何解决问题有所了解?

谢谢!

编辑:这就是我创建意图的方式。

  Intent intent = new Intent(Intent.ACTION_VIEW);
  String extension = EventUtil.getExtension(file);
  String type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
  Uri uri = Uri.parse(getContext().getPackageName() + file.getPath());
  intent.setDataAndType(uri, type);

启动意图:

getContext().startActivity(intent);

另一个编辑!

修复损坏的网址后(请参阅下面的评论)我的ContentProvider openFile()正在调用,并没有抛出任何异常,但接收应用仍然崩溃。

还有另一个编辑.....

这肯定是我处理Uri的一个问题 - 我在下面的评论中链接的SO答案中的代码似乎给了我一些我不想要的额外路径信息(即data / data / com) .xxxxx.xxxxx / files / files / subdir / filename - 文件目录太多了!)但是我还没弄明白如何正确地获取正确创建url所需的内容!

1 个答案:

答案 0 :(得分:0)

所以,事实证明这完全是一个Uri问题。使用错误的方案(即file:///)传递Uri会导致接收应用程序崩溃,因为它无法正确解析Uri到文件 - 它需要是一个内容:// Uri方案。可悲的是,我没有找到任何方法来解决这种类型的方案而不向我们的应用程序添加框架,(Android支持4显然有一个FileProvider类正是这样做。)所以我不得不做一个String常量来保持第一部分Uri,然后在最后确定正确的路径。

我已经看到几个答案说你可以调用getContext()。getPackageName()+ file.getPath()但是正如用户njkz2指出的那样,这是不对的。如果没有正确的框架,您需要编写自己的类来处理Uri以传回正确的方案,或者需要使String常量指向您自己的内部文件目录。