0

いくつかのドキュメント (DOC、PDF、PPT...) を含む ListView を表示するアプリがあります。それらの 1 つを選択し、次のコードを使用してドキュメントを表示します。

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 で正常に開きます。ここで元に戻すと、Unable to start activity ...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 をダウンロードし、ファイルを保存して、サードパーティのビューアで開いていました。

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 参照があるようです。

経験上、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 に答える