ネイティブ Android カメラで画像をキャプチャして保存する方法
-
27-09-2019 - |
質問
ネイティブ カメラ アプリから画像をキャプチャして保存するときに問題が発生します。これは私のコードの一部のサンプルです。
_path = Environment.getExternalStorageDirectory() + "make_machine_example.jpg";
File file = new File( _path );
Uri outputFileUri = Uri.fromFile( file );
Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE );
intent.putExtra( MediaStore.EXTRA_OUTPUT, outputFileUri );
startActivityForResult( intent, 0 );
写真を撮った後、元のアクティビティに戻った後、Android DDMS ファイル エクスプローラー経由で SD カードに移動すると、写真がそこにありません。これが保存されない理由を知っている人はいますか?
解決
それは末尾のファイル区切り文字を(/)が含まれていない場合は、あなたのイメージのようなSDカード上に存在しないディレクトリになってしまいますので、
あなたは何Environment.getExternalStorageDirectory(の出力確認しました)は、次のとおりです。
/mnt/sdcardmake_machine_example.jpg
ときに何が本当にしたいことはあります:
/mnt/sdcard/make_machine_example.jpg
の代わりにこのコードを試してみてください。
_path = Environment.getExternalStorageDirectory() + File.separator + "make_machine_example.jpg";
他のヒント
ここで場合の最終製品は、誰もが、まだこのスレッドを訪問されました。
public class CameraCapture extends Activity {
protected boolean _taken = true;
File sdImageMainDirectory;
protected static final String PHOTO_TAKEN = "photo_taken";
@Override
public void onCreate(Bundle savedInstanceState) {
try {
super.onCreate(savedInstanceState);
File root = new File(Environment
.getExternalStorageDirectory()
+ File.separator + "myDir" + File.separator);
root.mkdirs();
sdImageMainDirectory = new File(root, "myPicName");
startCameraActivity();
}
} catch (Exception e) {
finish();
Toast.makeText(this, "Error occured. Please try again later.",
Toast.LENGTH_SHORT).show();
}
}
protected void startCameraActivity() {
Uri outputFileUri = Uri.fromFile(sdImageMainDirectory);
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
startActivityForResult(intent, 0);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (resultCode) {
case 0:
finish();
break;
case -1:
try {
StoreImage(this, Uri.parse(data.toURI()),
sdImageMainDirectory);
} catch (Exception e) {
e.printStackTrace();
}
finish();
startActivity(new Intent(CameraCapture.this, Home.class));
}
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
if (savedInstanceState.getBoolean(CameraCapture.PHOTO_TAKEN)) {
_taken = true;
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putBoolean(CameraCapture.PHOTO_TAKEN, _taken);
}
public static void StoreImage(Context mContext, Uri imageLoc, File imageDir) {
Bitmap bm = null;
try {
bm = Media.getBitmap(mContext.getContentResolver(), imageLoc);
FileOutputStream out = new FileOutputStream(imageDir);
bm.compress(Bitmap.CompressFormat.JPEG, 100, out);
bm.recycle();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
1.ただ使用してください
new File(Environment.getExternalStorageDirectory(), "make_machine_example.jpg");
区切り文字を気にする必要はありません。
2.以前にも同じ問題に直面しました。SenseUI 電話には、ファイルを作成しないカスタム カメラ アプリケーションが搭載されています。どのようなデバイスを使用していますか?最新のデバイスではすでに修正されている可能性がありますが、依然として問題である可能性もあります。それを克服する方法の完全なサンプルをここに示します 写真をファイルに保存する際の問題.
あなたは画像を保存した後、メディアスキャンを実行する必要があります。
sendBroadcast(new Intent(
Intent.ACTION_MEDIA_MOUNTED,
Uri.parse("file://" + Environment.getExternalStorageDirectory())));
AndroidManifest.xmlファイルに次の行を追加し、拡張make_machine_exampleを削除します:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
これは、SDカードに写真や店をキャプチャするために開始します。
所属していません StackOverflow