2016-04-11 38 views
0

Androidの場合、hereのようにこの基本設定で写真を撮ることができます。ACTION_IMAGE_CAPTUREインテントを使用しているときにAndroidカメラの動作を正しくキャッチする方法

protected void dispatchTakePictureIntent(){ 
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    if (takePictureIntent.resolveActivity(getPackageManager()) != null) { 

     ... 
     takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile)); 
     startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO); 
    } 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) { 
     //do stuff with the output file 
    } 
} 

ただし、third-party camera apps are unpredictable and cannot be guaranteed to play niceです。

出力の検証/エラーをキャッチする正しい方法は何ですか?私はtry/catchブロックの内側にstartActivityForResultを入れるべきですか?キャッチしようとしているはずのさまざまなタイプの例外とは何ですか?また、私はそれらと何をすべきですか?

答えて

1

try/catchブロック内にstartActivityForResultをラップする必要がありますか?

はい、これは具体的にはACTION_IMAGE_CAPTUREとは関係ありませんが、ユーザーがカメラアプリにアクセスできない可能性があります(共有ユーザーの制限付きプロフィールでユーザーが実行されているなど)。 またはstartActivityForResult()と暗黙のうちにIntentを呼び出す場合は、利用可能なアプリがない可能性に対処する必要があります。

キャッチしようとしているはずのさまざまな種類の例外と、それらとは何をすべきですか?あなたがするリンクの答えで

、私はカメラアプリでクラッシュを指摘されました。それはあなたのアプリではないので、それらをキャッチすることはできません。あなたがACTION_IMAGE_CAPTURE活動を開始するCAMERA許可を必要とするよう

ActivityNotFoundExceptionを越えて、あなたはまた、Androidの6.0のランタイム許可を考える必要があります。ただし、通常は例外ハンドラは必要ありません。

他の検証が例外に基づいていますが、欠陥のある結果に基づいていないことになります。あなたがEXTRA_OUTPUTを与えた場合

  • 、あなたが指定したUriでどんなコンテンツがあるのでしょうか?理論的には、ユーザーがカメラアプリをキャンセルしなかった場合、カメラアプリのバグのために、それは保証されませんが、保証はありません。

  • コンテンツがある場合は、画像ファイルですか?たとえば、BitmapFactoryinJustDecodeBoundsを使用して、画像が実際に画像であるかどうかを確認できます。何のコンテンツが存在しない場合

  • 、あなたはonActivityResult()で結果IntentUriを取り戻すために起こるのですか?バグのあるカメラアプリは、ACTION_IMAGE_CAPTUREの仕様外の方法であっても、希望の場所に画像を保存してUriを提供している可能性があります。

  • コンテンツがなく、Uriがない場合、getExtras("data")nullの値を返しますか?その場合、サムネイルを少なくとも持っていて、画質は落ちるかもしれませんが、自分で保存することができます。背中結果Intent`で可能な `ウリについて

+0

、私はまだ私が今グーグルに基づいて' Uri'の使用に慣れていないよ、あなたは 'ウリmyUri =ウリのようなものをかどうかを確認するために言っています。 parse(data.getExtras()。getString(MediaStore.EXTRA_OUTPUT)); '' file: '型を含む' Uri'を与えますか? – KaliMa

+0

@KaliMa:いいえ、 'onActivityResult()'に渡された 'Intent'の' getData() 'が' Uri'を返すのではないでしょうか。私は、カメラアプリケーションが 'onActivityResult()'経由で 'EXTRA_OUTPUT'を余分に使ってあなたに' Intent'を送ることができたとは思っていませんが、そのシナリオについては聞いていません。私は、 'Uri'を' Intent'自身の 'Uri'として送るカメラアプリについて聞いたことがあります。 – CommonsWare

+0

しかし、 'takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT、Uri.fromFile(photoFile));を指定した場合、 '結果の画像ファイルが' onActivityResult() 'のどこにあるのかはすでに分かっていませんか?それとも、どこのアプリでもそれを完全に無視してどこにでも置くことができますか? – KaliMa

関連する問題