使用摄像头意图获取Android中捕获图像的路径

使用摄像头意图获取Android中捕获图像的路径,android,android-camera-intent,Android,Android Camera Intent,我一直在尝试获取捕获图像的路径,以便删除图像。在StackOverflow上找到了许多答案,但没有一个对我有用。我得到了以下答案: 私有字符串getLastImagePath(){ 最终字符串[]imageColumns={MediaStore.Images.Media.\u ID, MediaStore.Images.Media.DATA}; 最终字符串imageOrderBy=MediaStore.Images.Media.\u ID+“DESC”; Cursor imageCursor=P

我一直在尝试获取捕获图像的路径,以便删除图像。在StackOverflow上找到了许多答案,但没有一个对我有用。我得到了以下答案:

私有字符串getLastImagePath(){
最终字符串[]imageColumns={MediaStore.Images.Media.\u ID,
MediaStore.Images.Media.DATA};
最终字符串imageOrderBy=MediaStore.Images.Media.\u ID+“DESC”;
Cursor imageCursor=POS.this.getContentResolver().query(
MediaStore.Images.Media.EXTERNAL\u CONTENT\u URI、imageColumns、,
null,null,imageOrderBy);
if(imageCursor.moveToFirst()){
//int id=imageCursor.getInt(imageCursor
//.getColumnIndex(MediaStore.Images.Media._ID));
String fullPath=imageCursor.getString(imageCursor
.getColumnIndex(MediaStore.Images.Media.DATA));
返回全路径;
}否则{
返回“”;
}
}
此代码适用于三星标签,但不适用于联想标签和i-ball标签。 那么,有人能帮我找到另一个解决方案来做同样的事情吗? 任何帮助都将不胜感激。多谢各位

这是我的onActivityResult:

if(requestCode==CmsInter.CAMERA\u请求和&resultCode==RESULT\u确定){
//位图照片=空;
//photo=(位图)data.getExtras().get(“数据”);
字符串txt=“”;
如果(im!=null){
字符串结果=”;
//im.setImageBitmap(照片);
im.setTag(“2”);
int index=im.getId();
字符串路径=getLastImagePath();
试一试{
bitmap1=BitmapFactory.decodeFile(路径、选项);
位图=位图.createScaledBitmap(位图1、512、400、false);
ByteArrayOutputStream bas=新的ByteArrayOutputStream();
compress(bitmap.CompressFormat.PNG,100,baos);
byte[]bytData=bas.toByteArray();
试一试{
baos.close();
}捕获(IOE异常){
e、 printStackTrace();
}
结果=Base64.encode(bytData);
bytData=null;
}捕获(OutOfMemoryError ooM){
System.out.println(“OutOfMemory异常------>”+ooM);
bitmap1.recycle();
bitmap.recycle();
}最后{
bitmap1.recycle();
bitmap.recycle();
}
}
}
试试这个

String[] projection = { MediaStore.Images.Media.DATA };
            @SuppressWarnings("deprecation")
            Cursor cursor = managedQuery(mCapturedImageURI, projection,
                    null, null, null);
            int column_index_data = cursor
                    .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            cursor.moveToFirst();
            image_path = cursor.getString(column_index_data);
            Log.e("path of image from CAMERA......******************.........",
                    image_path + "");
用于捕获图像:

    String fileName = "temp.jpg";
    ContentValues values = new ContentValues();
    values.put(MediaStore.Images.Media.TITLE, fileName);
    mCapturedImageURI = getContentResolver().insert(
            MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);

    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, mCapturedImageURI);
    values.clear();
像这样试试

如下图所示通过摄像机

Intent-Intent=新意图(本);
startActivityForResult(意图、要求、摄像机图像);
拍摄完图像后,在ActivityResult上写一个
,如下所示

activityresult上受保护的void(int-requestCode、int-resultCode、Intent-data){
if(requestCode==CAMERA\u请求和&resultCode==RESULT\u确定){
位图照片=(位图)数据.getExtras().get(“数据”);
设置图像位图(照片);
旋钮设置可见性(按钮可见);
//调用此方法从位图获取URI
Uri tempUri=getImageUri(getApplicationContext(),photo);
//调用此方法以获取实际路径
File finalFile=新文件(getRealPathFromURI(tempUri));
System.out.println(mImageCaptureUri);
}  
}
公共Uri getImageUri(文本中的上下文,图像中的位图){
ByteArrayOutputStream字节=新建ByteArrayOutputStream();
inImage.compress(位图.CompressFormat.JPEG,100,字节);
字符串路径=Images.Media.insertImage(inContext.getContentResolver(),inImage,“Title”,null);
返回Uri.parse(路径);
}
公共字符串getRealPathFromURI(Uri){
字符串路径=”;
if(getContentResolver()!=null){
Cursor Cursor=getContentResolver().query(uri,null,null,null,null);
如果(光标!=null){
cursor.moveToFirst();
int idx=cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
path=cursor.getString(idx);
cursor.close();
}
}
返回路径;
}
并检查日志

编辑:

很多人都在问,怎么才能不得到缩略图。您需要为
getImageUri
方法添加此代码:


    public Uri getImageUri(Context inContext, Bitmap inImage) {
        Bitmap OutImage = Bitmap.createScaledBitmap(inImage, 1000, 1000,true);
        String path = MediaStore.Images.Media.insertImage(inContext.getContentResolver(), OutImage, "Title", null);
        return Uri.parse(path);
    }

另一种方法压缩文件。您可以通过更改编号来调整大小
10001000

尝试此方法以获取相机拍摄的
原始图像的路径

public String getOriginalImagePath() {
        String[] projection = { MediaStore.Images.Media.DATA };
        Cursor cursor = getActivity().managedQuery(
                MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                projection, null, null, null);
        int column_index_data = cursor
                .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToLast();

        return cursor.getString(column_index_data);
    }

此方法将返回相机捕获的最后一幅图像的路径。因此,此路径将是原始图像,而不是缩略图位图。

有一个解决方案,可以创建文件(在外部缓存目录或其他任何位置),并将此文件的uri作为相机意图的额外输出-这将定义存储拍摄照片的路径

以下是一个例子:

File file;
Uri fileUri;
final int RC_TAKE_PHOTO = 1;

    private void takePhoto() {
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        file = new File(getActivity().getExternalCacheDir(), 
                String.valueOf(System.currentTimeMillis()) + ".jpg");
        fileUri = Uri.fromFile(file);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
        getActivity().startActivityForResult(intent, RC_TAKE_PHOTO);

    }


    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == RC_TAKE_PHOTO && resultCode == RESULT_OK) {

                //do whatever you need with taken photo using file or fileUri

            }
        }
    }
然后,如果不再需要该文件,可以使用
file.delete()将其删除


顺便说一下,当用户从应用程序设置中清除应用程序的缓存时,缓存目录中的文件将被删除。

这里我更新了Kotlin中的示例代码。请注意牛轧糖及以上版本的
Uri.fromFile(file)
不起作用,它会使应用程序崩溃,因为需要实现FileProvider,这是从intent发送文件的最安全的方式。要实现此功能,请参阅此或此

camera()拍摄的私人娱乐照{
val isDeviceSupportCamera:Boolean=此.packageManager.hasSystemFeature(packageManager.FEATURE\u摄像头)
如果(isDeviceSupportCamera){
val takePictureContent=Intent(MediaStore.ACTION\u IMAGE\u捕获)
if(takePictureContent.resolveActivity(getPackageManager())!=null){
file=file(getExternalFilesDir(Environment.DIRECTORY\u DOCUMENTS+“/attachments”)!!.path,
System.currentTimeMillis().toString()+
private fun takePhotoFromCamera() {
        val isDeviceSupportCamera: Boolean = this.packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA)
        if (isDeviceSupportCamera) {
            val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)

            if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
                file = File(getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS + "/attachments")!!.path,
                        System.currentTimeMillis().toString() + ".jpg")
//            fileUri = Uri.fromFile(file)
                fileUri = FileProvider.getUriForFile(this, this.applicationContext.packageName + ".provider", file!!)
                takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri)
                if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP) {
                    takePictureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
                }
                startActivityForResult(takePictureIntent, Constants.REQUEST_CODE_IMAGE_CAPTURE)
            }

        } else {
            Toast.makeText(this, this.getString(R.string.camera_not_supported), Toast.LENGTH_SHORT).show()
        }
    }

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (resultCode == Activity.RESULT_OK) {
             if(requestCode == Constants.REQUEST_CODE_IMAGE_CAPTURE) {
                realPath = file?.path
                 //do what ever you want to do
            }
    }
}