2013-10-25 120 views
0

我有一個應用程序顯示一個ListView與幾個文檔(DOC,PDF,PPT ...)。選擇其中的一個,我用下面的代碼來顯示文件:在意圖打開PDF後,應用程序崩潰與NullPointerExeption

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:"));       

,對於所選擇的第一個文件工作正常,北極星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 
+0

你能發佈您的LogCat錯誤嗎? – 2Dee

+0

什麼是空指針例外指向?賠率是你的問題是你的onResume()代碼,因爲你的「選擇應用程序來查看這個文件」的代碼看起來是正確的。 –

+0

K5用戶:onResume()沒有被調用。當回到我的應用程序,只有onCreate()被調用,比崩潰 –

回答

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) { 
    } 
    } 
0

的意圖看起來好像是正確調用它適用於一些。似乎你會有一個空引用,而不檢查文件是否存在。

經驗告訴我null會出現,因爲您的設備在打開pdf文件時內存不足,因此您的應用程序被關閉以釋放一些內存。

解決方案是添加savedinstancestate方法,保存您的應用程序需要的內容,並檢查oninstate方法中的savedinstancestate!= null,然後從savedinstancestate重新創建應用程序需要的內容。

+0

發現一個奇怪的行爲。在4.1.1上運行Samsung Galaxy Tab 7時「我得到了前面提到的錯誤,但是在運行在4.1.2的Samsung Galaxy III mini上時,它的工作非常完美 –

+0

它就像一個記憶的東西,同樣的問題可能表現出來在一個旋轉變化horz-vert你保存狀態在savedinstancestate然後恢復它在創建捆綁。 – danny117

0

我在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); 
相關問題