我想拍照并将其存储在名为Medit的文件夹中,通过我的应用程序。当我的应用程序启动时,它应该能够从该文件夹中提取所有图片并直接显示它。因此,必须设置数据存储路径并将其存储为应用程序的一部分。这是我到目前为止所做的事情
public void CaptureImage(){
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
mediaStorageDir =new File(Environment.getExternalStorageDirectory(),"MyAppName");
mUri =Uri.fromFile(mediaStorageDir+"IMG"+System.currentTimeMillis() + ".jpg");
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, mUri);
startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
super.onActivityResult(requestCode, resultCode, data);
Bitmap bm = BitmapFactory.decodeFile(mUri.getPath());
imgVIew.setImageBitmap(bm);
}else Log.d("capture", "FAILED");}
问题是,无论我将mUri更改为图片的内容都存储在具有默认命名约定的DCIM /相机图像中。在onActivityResult中我正在捕捉图像。问题是我无法控制存储的位置和名称。我需要
1)通过意图捕获图像,将其存储在具有自定义名称的位置。
2)每次应用程序打开时,都应该转到相同的存储位置并取出图片并逐个显示。
答案 0 :(得分:0)
无论我将更改mUri到图片的内容存储在具有默认命名约定的DCIM /相机图像中
很有可能,那是相机应用中的一个错误。大多数相机应用都会正确尊重EXTRA_OUTPUT
。但是,没有强制机制来确保相机应用程序将尊重EXTRA_OUTPUT
。
但是,请不要使用字符串连接来创建文件路径,并确保创建目录。 IOW,替换:
mediaStorageDir =new File(Environment.getExternalStorageDirectory(),"MyAppName");
mUri =Uri.fromFile(mediaStorageDir+"IMG"+System.currentTimeMillis() + ".jpg");
使用:
mediaStorageDir=new File(Environment.getExternalStorageDirectory(),"MyAppName");
mediaStorageDir.mkdirs();
mUri=Uri.fromFile(new File(mediaStorageDir, "IMG"+System.currentTimeMillis() + ".jpg"));
更改此代码可能会使您的应用与此特定相机应用更兼容,但无法保证所有相机应用的行为符合您的要求。
我需要......
您的代码是为了满足您的需求而编写的。但是,您正在使用ACTION_IMAGE_CAPTURE
Intent
调用第三方应用。有数以千计的相机应用程序,既可以预先安装,也可以从Play商店和其他地方下载。许多人将有适当的ACTION_IMAGE_CAPTURE
实施。有些人不会。
或者:
检测到图像不在您想要的路径上,让用户知道他们的相机应用程序已损坏。然后,建议他们安装一些您测试过的第三方相机应用程序。或者,
停止使用ACTION_IMAGE_CAPTURE
并直接使用相机API,但这很困难。
答案 1 :(得分:0)
您的图片正在保存在默认路径中,因为您提供的路径错误。使用以下代码。
File mediaStorageDir =new File(Environment.getExternalStorageDirectory(),"MyAppName");
if(!mediaStorageDir.exists())
mediaStorageDir.mkdir();
Uri mUri = Uri.fromFile(new File(mediaStorageDir.getAbsolutePath() + "/IMG" + System.currentTimeMillis() + ".jpg"));
LogHelper.LogI("path", mUri.getPath());
答案 2 :(得分:0)
请尝试以下代码,它正在为我工作。
public class CaptureImage extends Activity {
private static final int PICK_CAMERA_IMAGE = 2;
ImageView img;
Button btn;
private Uri mImageCaptureUri;
public static String userPicPath;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_capture_image);
img = (ImageView) findViewById(R.id.activity_capture_image_img);
btn = (Button) findViewById(R.id.button1);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
SimpleDateFormat dateFormatter = new SimpleDateFormat(
"yyyyMMdd_HHmmss", Locale.US);
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File file = new File(Environment.getExternalStorageDirectory()
+ "/" + Constants.IMAGE_DIRECTORY_NAME, "img_"
+ dateFormatter.format(new Date()).toString() + ".png");
userPicPath = file.getPath();
mImageCaptureUri = Uri.fromFile(file);
intent.putExtra(MediaStore.EXTRA_OUTPUT, mImageCaptureUri);
startActivityForResult(intent, PICK_CAMERA_IMAGE);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == PICK_CAMERA_IMAGE && resultCode == RESULT_OK) {
Log.d("CaptureImage", mImageCaptureUri.toString());
Bitmap bitmapProfile = getBitmap(userPicPath, this);
img.setImageBitmap(bitmapProfile);
}
}
public static Bitmap getBitmap(String path, Context context) {
Uri uri = Uri.fromFile(new File(path));
InputStream in = null;
ContentResolver mContentResolver = context.getContentResolver();
try {
// final int IMAGE_MAX_SIZE = 2048;
final int IMAGE_MAX_SIZE = 1024;
in = mContentResolver.openInputStream(uri);
// Decode image size
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
BitmapFactory.decodeStream(in, null, o);
in.close();
int scale = 1;
if (o.outHeight > IMAGE_MAX_SIZE || o.outWidth > IMAGE_MAX_SIZE) {
scale = (int) Math.pow(
2,
(int) Math.round(Math.log(IMAGE_MAX_SIZE
/ (double) Math.max(o.outHeight, o.outWidth))
/ Math.log(0.5)));
}
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize = scale;
in = mContentResolver.openInputStream(uri);
Bitmap b = BitmapFactory.decodeStream(in, null, o2);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
b.compress(Bitmap.CompressFormat.JPEG, 25, stream);
in.close();
return b;
} catch (FileNotFoundException e) {
Log.e("CaptureImage", "file " + path + " not found");
} catch (IOException e) {
Log.e("CaptureImage", "file " + path + " not found");
}
return null;
}
}