【问题标题】:Facing an issue with using camera by intent in Android面临在 Android 中按意图使用相机的问题
【发布时间】:2015-09-07 11:17:13
【问题描述】:

我想通过我的应用拍照并将其存储在名为 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) 应用每次打开都要到同一个存储位置,把图片拉出来一张一张显示。

【问题讨论】:

  • 请粘贴您的 onActivityResult
  • 刚刚做了。我需要一个访问路径。我使用voidcanvas.com/whatsapp-like-image-compression-in-android 作为参考,但由于某种原因,这个应用程序在我朋友的手机上不停地崩溃。所有手机可能都没有外置 SD 卡,所以我也需要检查一下吗?
  • 没有安全路径,因为用户可以看到对 SD 卡或内部存储的最新更改。所以你必须加密你的数据,如果它们是敏感的
  • 没有数据不安全。我的错。我的意思是一条我可以继续重复使用的路径,因为我想在应用启动后加载相同的图片。
  • 查找 Environment.getExternalStorageDirectory()

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


【解决方案1】:

无论我将 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,尽管这相当困难。

【讨论】:

  • 我按照您所说的替换了所需的行,但它并没有改变图像的存储位置。它仍然是 DCIM / 相机。我会拿我朋友的手机在他的手机上试一试。
【解决方案2】:

您的图片保存在默认路径中,因为您提供的路径错误。使用以下代码。

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());

【讨论】:

    【解决方案3】:

    请尝试以下对我有用的代码。

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

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多