2016-06-28 4 views
0

AndroidでACTION_IMAGE_CATPUREインテントを実行する最も信頼性の高い方法は何ですか?私はオンラインで見つけたものを複数試してみましたが、どれもすべてのデバイスで動作していません。テストデバイスは、Nexus 6(Android 6.0.1)とLenovo電話(4.4.2)です。ACTION_IMAGE_CAPTUREインテントを信頼できる方法で実行しますか?

オプションA

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((のみネクサス6で動作します): - 私は、次の(これらは明らかに正常に動作している権限のような取り外し冗長コード)を試してみた

どちらでも動作しませんが、両方で動作するはずです)

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版でこれを行うには信頼できる方法になるはずですが、私は過去1時間にスタックオーバーフローが発生しており、試した10個以上の解決策があります。 Androidのバージョン。

ACTION_IMAGE_CAPTUREインテントから確実にUriを取得するにはどうすればよいですか?

+0

あなたのlogcat whatsシステムが言っていることを示しますか? –

+0

ログにはランダム性があります。探したいのは何ですか? printステートメントの前にスローされたエラーはありません。つまり、コピーして貼り付けることができますが、探したいものが分からないと約500行になります。 – CaptainForge

+0

@SohailZahid上記のSystem.outを意味するのであれば、説明したようにfalseを出力します。 – CaptainForge

答えて

1

//これは、Androidのすべてのバージョンで失敗する6.0

にキットカットにはfalseが、真出力します。 outputFileUri.toString()"file:///..."(一部の値は...)のようなもので、有効なファイルシステムパスではありません。おそらく、GoogleはFileを更新してスキームを取り除くことに対応していました。

より良い解決策は、正しいFileオブジェクトであるnew File(root, fname)を保持することです。カメラアプリケーションがフォアグラウンドにある間にプロセスが終了する可能性があるので、保存されたインスタンスの状態Bundleでこれを保持してください。

targetSdkVersionfileUri values are bannedの場合は、APIレベル24以降では機能しません。

だが、それはACTION_IMAGE_CAPTUREはおろかUriを返すこと状態はありません両方

The documentationに取り組むべきであると思われます。私はこれが論理的に答えになるはずだが、Androidには論理を無視するものがたくさんあることに同意する。

まあ、ACTION_IMAGE_CAPTUREのうち、信頼性の高い結果を期待することは愚かであるAndroidのバージョン

間でこれを行うための信頼性の高い方法があるはずのように思えます。あなたはサードパーティのアプリケーションに委任しています。何千ものAndroidデバイスモデルがあり、それらには何百ものカメラアプリが搭載されています。 Playストアや他の場所には何百ものものがあります。多くのカメラアプリの開発者はACTION_IMAGE_CAPTUREをよくテストしておらず、EXTRA_OUTPUTを完全に無視するなど、バグがある多くのカメラアプリがあります。彼らはここcontentUriを期待することはできませんよう

さらに多くは、前述のfileUri禁止に巻きトリップしてしまいます。ヘック、グーグルも、彼らはcontentUri値、およびwill not do so for some timeを処理しない程度に、すべてのことずっと自分のカメラアプリにACTION_IMAGE_CAPTUREをテストする気にしません。

ACTION_IMAGE_CAPTUREを自由に使用できますが、正常に機能しないように準備してください。

+0

ACTION_IMAGE_CATUREは使用しないでください。写真を撮るにはどうすればいいですか?自分のカメラアプリを作る必要がありますか? – CaptainForge

+0

@CaptainForge:あなたのオプションは: 'ACTION_IMAGE_CAPTURE'を使用し、サードパーティのカメラアプリのバグでライブをする、ライブラリ(例:[mine](https://github.com/commonsguy/cwac-cam2) *そのバグ、またはカメラAPIを直接使用する。 – CommonsWare

関連する問題