最近、カメラのビルドから写真を撮り、それをアプリケーションに戻す必要がある Android アプリケーションを作成しました。そこにある多くのチュートリアルの1つを使用しましたが、すべてうまくいきました。しかし、その後、別のデバイスでテストしましたが、何も機能しませんでした。問題があるようですが、すべてのデバイスで写真を撮れるようにするにはどうすればよいですか? (私の答えを見てください。これはチュートリアルのようなものです)
1 に答える
そこにある多くのチュートリアルの1つを使用しましたが、すべてうまくいきました。しかし、その後、別のデバイスでテストしましたが、何も機能しませんでした。最初はとても驚きましたが、このトピックをさらに深く掘り下げることにしました。そして、これらのチュートリアルの多くが大きな問題を引き起こす可能性があることに気付きました. だから私はあなたと私の経験を共有することにしました.
ほとんどのチュートリアルで使用されている一般的なアプローチから始めましょう。
最初に、次のような requestID を選択します。
private static final int CAMERA_PIC_REQUEST = 1337;
次に、インテントを作成し、カメラ アクティビティを開始します。
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST);
ピクチャを取得するには、onActivityResult 関数を使用して、受信したインテント データからピクチャを読み取ります。
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == CAMERA_PIC_REQUEST && resultCode == RESULT_OK && data != null) {
// do something like
Bitmap bitmap = (Bitmap) data.getExtras().get("data");
}
}
いいですね。それはうまくいきますが、ここで難しい部分があります。
Android のドキュメントに書かれているように、インテント データは sacled down のみを返すか、撮影した写真の小さなバージョンを返すだけで、一部のデバイスでは何も返されません。データが null でなくても、「結果 ResultInfo の配信に失敗しました」という例外が発生する場合もあります。
ならどうしよう?これに対する解決策は非常に簡単です。画像を SD カードに保存し、このファイルへの URI を返すようにカメラに指示するだけです。以下に、上から編集したコードを示します。
静的な requestIDとURIを作成します
private static final int CAMERA_PIC_REQUEST = 1337;
private static Uri outputFileUri;
カメラ アクティビティを作成しますが、今回は追加のパラメーター (URI) を渡します。
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST);
次に、画像を処理するために上記と同じ方法を使用しますが、インテント データを使用する代わりに URI を使用します
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == CAMERA_PIC_REQUEST && resultCode == RESULT_OK) {
// do something to get the bitmap from the uri for example
Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), outputFileUri);
}
このソリューションを使用すると、すべてのデバイスで確実に画像を取得できます。ただし、フルスケールのビットマップを取得するため、メモリ不足エラーを回避するためにビットマップを縮小する必要がある場合があることに注意してください。写真をユーザーの SD カードに保存したくない場合は、そのファイルを削除してください。
読んでくれてありがとう!