面对Android中使用相机的问题

时间:2015-09-07 11:17:14

标签: android image android-intent android-camera android-camera-intent

我想拍照并将其存储在名为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)每次应用程序打开时,都应该转到相同的存储位置并取出图片并逐个显示。

3 个答案:

答案 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;
}

}