2011-08-24 54 views
1

我正在處理與相機使用有關的隨機問題。在我調用相機意圖之前 - 我生成UUID以存儲具有此名稱的文件。我保存這個UUID在私有變量,像這樣:使用相機意圖時,Android本地變量會丟失

private String requestedFileName; 

當相機完成 - 我處理完這個文件,看起來像這樣:

public void onPictureTaken(int index) 
    { 
     //First of all - remember picture in database for reference. 
     FileData.InsertFile(mContext, UUID.fromString(requestedFileName)); 

     //Reduce taken picture if needed, otherwise let it be original. 
     if (Preferences.getImageSize(mContext) > 0) 
     { 
      Imaging.scaleImageFile(mContext, requestedFileName, Preferences.getImageSize(mContext)); 
     } 

我看到的用戶報告的問題異常歸結爲requestedFileName == NULLonPictureTaken稱爲

Caused by: java.lang.NullPointerException 
at java.util.UUID.fromString(UUID.java:210) 
at com.idatt.views.FourImagesView.onPictureTaken(FourImagesView.java:151) 
at com.idatt.views.TrailerUnitView.onPictureTaken(TrailerUnitView.java:233) 

一切適用於我的手機(Nexus S)和仿真器。但用戶報告此異常,我不知道爲什麼會發生這種情況..

+0

你確定你總是在變量requestedFileName中存儲文件名嗎?它不能爲空? – Shlublu

+0

是的,除非它是完全愚蠢的錯誤 - 我100%肯定它不會發生... – katit

回答

3

我見過這種情況發生在Nexus手機和其他一些。如果你使用DDMS來觀察發生了什麼,我敢打賭你會發現你的進程實際上正在被終止然後重新啓動。因此你的本地狀態正在喪失。你需要堅持下去,因爲如果你切換到一個新的任務(大多數攝像機捕捉意圖設置NEWTASK標誌),Android基本上可以殺死你的進程並在需要時重新啓動它。

如果你的類是Activity可以使用onSaveInstanceState()來存儲你的文件名,然後讀回了你onCreate()得到Bundle的。

如果你不是一個Activity可以使用SharedPreferences店作爲一個臨時的地方保存的文件名:

private static void saveTempFileName(Context context, String filename) { 
    SharedPreferences settings = context.getSharedPreferences("whatever", 0); 
    SharedPreferences.Editor editor = settings.edit(); 
    editor.putString("com.yourstuff.whatever", filename); 
    editor.commit(); 
} 
+0

不幸的是,我不能看它,因爲我沒有這些手機。我正在考慮堅持國家,但我不知道如何去做我的情況。這不是Activity,它是我自定義的View(擴展LinearLayout)。我必須公開方法來保持狀態並從父Activity調用它們嗎? – katit

+0

是的,我看到它發生在那些手機上。只要將您的文件名寫入'SharedPreferences'並在您的處理程序中將其讀回,如果您的成員變量爲'null'。 –

1

正如@jeffamaphone注意您可能具有應用程序配置更改的問題。發生影響應用運行時環境的事情時,會發生應用程序配置更改。最值得注意的是:方向改變或鍵盤隱藏/顯示。

嘗試此操作:啓動您的應用程序,調用相機應用程序(通過您的應用程序操作),更改方向,返回到您的應用程序(通過適當的操作)。這個序列是否會產生錯誤?然後你有配置更改的問題 - 當方向變化通常(取決於你的應用程序設置)Android系統重新啓動(殺死並創建新實例)你的活動,這可能會創建所有新的視圖(沒有UUID設置)。

請參閱handling configuration changes

+0

謝謝!支票轉到jeffamaphone,但你確實幫了我(upvote)。我忘記了方向。我的應用程序如果修正了縱向,所以我將它設置爲可以傾斜,並且能夠立即模擬異常。 – katit