2016-06-28 26 views
0

在Android上執行ACTION_IMAGE_CATPURE意圖的最可靠方法是什麼?我已經嘗試過多種在線搜索,並且它們都不適用於任何設備。我的測試設備是Nexus 6(Android 6.0.1)和聯想手機(4.4.2)。做ACTION_IMAGE_CAPTURE意圖的可靠方法?

我試過以下(去除冗餘代碼樣的權限 - 這顯然正常工作):

選項A(只適用於Nexus 6)

final File root = new File(Environment.getExternalStorageDirectory() + File.separator + "MyDir" + File.separator); 
root.mkdirs(); 
final String fname = "img_" + System.currentTimeMillis() + ".jpg"; 
outputFileUri = Uri.fromFile(new File(root, fname)); 

Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
takePhotoIntent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, outputFileUri); 

try { 
    startActivityForResult(takePhotoIntent, 1); 
} catch (SecurityException e) { } 

// .... 

public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    System.out.println(new File(outputFileUri.toString()).exists())); 
    // This prints false on Kitkat, but true on 6.0 

選項B(在兩者上都不起作用,但似乎它應該對兩者都起作用)

Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
outputFileUri = takePhotoIntent.getData(); 
// start intent 

// ..... 

    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    System.out.println(new File(outputFileUri.toString()).exists())); 
    // This prints false on everything 

它似乎有應該是一個可靠的方式來做到這一點在Android版本,但我一直在堆棧溢出了過去一小時,有10多個我嘗試過的解決方案,並沒有一個在舊的工作Android版本。

如何可靠地從ACTION_IMAGE_CAPTURE意圖獲取Uri?

+0

顯示你的logcat什麼系統在說什麼? –

+0

日誌充滿了隨機性 - 我應該尋找什麼?打印聲明之前沒有發生任何錯誤。我的意思是,我可以複製/粘貼它,但它將會有大約500行,而不知道要查找什麼。 – CaptainForge

+0

@SohailZahid如果你的意思是上面的System.out,它只是按照描述打印假。 – CaptainForge

回答

1

//這將打印假的奇巧,但真正在6.0

這應該在Android上的所有版本失敗。 outputFileUri.toString()將類似於"file:///..."(對於某些值爲...),並且這不是有效的文件系統路徑。也許谷歌更新了File來處理剝離計劃。

更好的解決方案是堅持new File(root, fname),這是正確的File對象。請記住,當相機應用程序處於前景時,您的過程可能會終止,因此請在保存的實例狀態Bundle中保留此過程。

另外請記住,一旦您的targetSdkVersion爲24或更高,您的方法將無法在API級別24+上工作,如fileUri values are banned

但目前看來,它應該在兩個

The documentation工作並沒有說明ACTION_IMAGE_CAPTURE將返回什麼,更不用說Uri。我同意這在邏輯上應該是答案,但Android中存在許多違反邏輯的事情。

這好像應該是在Android版本

那麼做一個可靠的方法,希望出來的ACTION_IMAGE_CAPTURE是愚蠢可靠的結果。您正在委派第三方應用。有數以千計的Android設備型號,以及數百款相機應用。 Play商店和其他地方還有數百個。許多相機應用程序開發人員不會很好地測試ACTION_IMAGE_CAPTURE,並且有許多相機應用程序存在缺陷,例如完全忽略EXTRA_OUTPUT

有更多人通過上述fileUri禁令得到絆倒了,因爲他們在這裏不能期待一個contentUri。哎呀,谷歌根本不屑於自己的相機應用測試ACTION_IMAGE_CAPTURE所有的東西,對他們不處理contentUri值,並will not do so for some time的程度。

隨意使用ACTION_IMAGE_CAPTURE,但只是準備好優雅地失敗。

+0

好的,所以如果我不應該使用ACTION_IMAGE_CATURE,我應該如何拍照?我是否必須製作自己的相機應用程序? – CaptainForge

+0

@CaptainForge:你的選擇是:使用ACTION_IMAGE_CAPTURE和第三方相機應用程序錯誤,使用庫(例如,[我的](https://github.com/commonsguy/cwac-cam2))並與*它的錯誤,或直接使用相機API。 – CommonsWare

相關問題