0

我有一个应用程序,它显示一个包含多个文档(DOC、PDF、PPT...)的 ListView。选择其中之一,我使用以下代码显示文档:

Intent intent = new Intent(android.content.Intent.ACTION_VIEW);
String extension = android.webkit.MimeTypeMap.getFileExtensionFromUrl(Uri.fromFile(outFile).toString());
String mimetype = android.webkit.MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
if (extension.equalsIgnoreCase("") || mimetype == null) {
    intent.setDataAndType(Uri.fromFile(outFile), "text/*");
} else {
    intent.setDataAndType(Uri.fromFile(outFile), mimetype);            
}
startActivity(Intent.createChooser(intent, "Choose an Application:"));                           

这适用于选择的第一个文档,Polaris Office 打开并显示文档 - 很好。当切换回来选择下一个文档时,我的应用程序不在显示的最后一个屏幕上,而是再次启动。选择文档可以在 Polaris 中正常打开。现在切换回来时,应用程序崩溃,无法启动活动 ...MainActivity ... NullPointerExpetion。

我能做些什么来解决这个问题?

这里是 LogCat:

 10-25 10:07:43.476: D/AndroidRuntime(8396): Shutting down VM
 10-25 10:07:43.476: W/dalvikvm(8396): threadid=1: thread exiting with uncaught    exception (group=0x415092a0)
 10-25 10:07:43.507: E/AndroidRuntime(8396): FATAL EXCEPTION: main
 10-25 10:07:43.507: E/AndroidRuntime(8396): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.astrex.ppastrex/com.astrex.ppastrex.MainActivity}: java.lang.NullPointerException
 10-25 10:07:43.507: E/AndroidRuntime(8396):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2097)
 10-25 10:07:43.507: E/AndroidRuntime(8396):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2122)
 10-25 10:07:43.507: E/AndroidRuntime(8396):    at android.app.ActivityThread.access$600(ActivityThread.java:140)
 10-25 10:07:43.507: E/AndroidRuntime(8396):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1228)
 10-25 10:07:43.507: E/AndroidRuntime(8396):    at android.os.Handler.dispatchMessage(Handler.java:99)
 10-25 10:07:43.507: E/AndroidRuntime(8396):    at android.os.Looper.loop(Looper.java:137)
 10-25 10:07:43.507: E/AndroidRuntime(8396):    at android.app.ActivityThread.main(ActivityThread.java:4895)
 10-25 10:07:43.507: E/AndroidRuntime(8396):    at java.lang.reflect.Method.invokeNative(Native Method)
 10-25 10:07:43.507: E/AndroidRuntime(8396):    at java.lang.reflect.Method.invoke(Method.java:511)
 10-25 10:07:43.507: E/AndroidRuntime(8396):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:994)
 10-25 10:07:43.507: E/AndroidRuntime(8396):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:761)
 10-25 10:07:43.507: E/AndroidRuntime(8396):    at dalvik.system.NativeStart.main(Native Method)
 10-25 10:07:43.507: E/AndroidRuntime(8396): Caused by: java.lang.NullPointerException
 10-25 10:07:43.507: E/AndroidRuntime(8396):    at com.astrex.ppastrex.FrameDocumentos.onCreateView(FrameDocumentos.java:66)
 10-25 10:07:43.507: E/AndroidRuntime(8396):    at android.support.v4.app.Fragment.performCreateView(Fragment.java:1478)
 10-25 10:07:43.507: E/AndroidRuntime(8396):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:927)
 10-25 10:07:43.507: E/AndroidRuntime(8396):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
 10-25 10:07:43.507: E/AndroidRuntime(8396):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1086)
 10-25 10:07:43.507: E/AndroidRuntime(8396):    at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:1877)
 10-25 10:07:43.507: E/AndroidRuntime(8396):    at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:552)
 10-25 10:07:43.507: E/AndroidRuntime(8396):    at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1178)
 10-25 10:07:43.507: E/AndroidRuntime(8396):    at android.app.Activity.performStart(Activity.java:5173)
 10-25 10:07:43.507: E/AndroidRuntime(8396):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2070)
 10-25 10:07:43.507: E/AndroidRuntime(8396):    ... 11 more
4

3 回答 3

1

我在 Android 6.0 上遇到了类似的问题,但在 4.4 中没有,所以对于旧设备,它可以正常工作并且不会崩溃。

就我而言,我正在下载一个 url,保存文件并在 3rd 方查看器中打开它们。

我发现只要将 pdf 保存到下载目录,它就可以针对我的情况进行修复。

File root = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
File dir = new File(root.getAbsolutePath());
if (dir.exists() == false) {
      dir.mkdirs();
}
String fileName = "filename.pdf";
file = new File(dir, fileName);
于 2016-10-28T21:32:38.050 回答
0

意图看起来被正确调用它适用于某些人。好像你有一个空引用而不检查文件是否存在。

经验告诉我 null 的出现是因为您的设备在打开 pdf 文件时内存不足,因此您的应用程序被关闭以释放一些内存。

解决方案是添加 savedinstancestate 方法来保存您的应用程序需要的内容,并检查您的 oncreate 方法中是否 savedinstancestate != null 然后从 savedinstancestate 重新创建您的应用程序需要的内容。

于 2013-10-25T15:37:26.973 回答
0

试试这样:

 File file = new File(pdfpath);

 if (file.exists()) {
     Uri path = Uri.fromFile(file);
     Intent intent = new Intent(Intent.ACTION_VIEW);
     intent.setDataAndType(path, "application/pdf");
     intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

     try {
       startActivity(intent);
       finish();
     } 
     catch (ActivityNotFoundException e) {
     }
  }
于 2013-10-25T14:41:25.537 回答