如何捕获图像并将其存储在本机 Android 相机中
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/3442462/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to capture an image and store it with the native Android Camera
提问by ninjasense
I am having a problem capturing an image and storing it from the native camera app. Here is a sample of some of my code.
我在捕获图像并将其从本机相机应用程序存储时遇到问题。这是我的一些代码示例。
_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 );
After the picture has been taken and I'm returned back to my original Activity, When I navigate to my sd card via Android DDMS File Explorer the picture is not there. Anyone know why this is not being saved?
拍完照片后,我返回到我原来的活动,当我通过 Android DDMS 文件资源管理器导航到我的 SD 卡时,图片不在那里。有谁知道为什么这没有被保存?
采纳答案by stealthcopter
Have you checked what the output of Environment.getExternalStorageDirectory() is, because if it does not contain a trailing file seperator (/) then your image will end up in a directory that does not reside on the SDcard such as:
您是否检查过 Environment.getExternalStorageDirectory() 的输出是什么,因为如果它不包含尾随文件分隔符 (/),那么您的图像将最终出现在一个不在 SD 卡上的目录中,例如:
/mnt/sdcardmake_machine_example.jpg
When what you really want is:
当你真正想要的是:
/mnt/sdcard/make_machine_example.jpg
Try this code instead:
试试这个代码:
_path = Environment.getExternalStorageDirectory() + File.separator + "make_machine_example.jpg";
回答by ninjasense
Here was the final product in case anyone is still visiting this thread:
这是最终产品,以防有人仍在访问此线程:
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();
}
}
}
回答by Fedor
1 . Just use
1 . 只需使用
new File(Environment.getExternalStorageDirectory(), "make_machine_example.jpg");
and don't bother about separators.
不要理会分隔符。
2 . Faced the same problem before. SenseUI phones have a custom camera application that doesn't create file. What device are you using? It may already be fixed in latest devices but it may also still be an issue. So here's a complete sample how to overcome it Problems saving a photo to a file.
2 . 之前遇到过同样的问题。SenseUI 手机有一个不创建文件的自定义相机应用程序。您使用的是什么设备?它可能已经在最新的设备中得到修复,但它也可能仍然是一个问题。所以这里有一个完整的示例如何克服它将照片保存到文件的问题。
回答by KP_
You should perform a media scanning after saving the image
您应该在保存图像后执行媒体扫描
sendBroadcast(new Intent(
Intent.ACTION_MEDIA_MOUNTED,
Uri.parse("file://" + Environment.getExternalStorageDirectory())));
回答by Gurdev
Add this line into AndroidManifest.xml file and remove extension make_machine_example:
将此行添加到 AndroidManifest.xml 文件并删除扩展名 make_machine_example:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
It will start to capture the Photo and store into the SDcard.
它将开始捕获照片并存储到 SD 卡中。