繁体   English   中英

Android从捕获的图像获取图像路径

[英]Android get image path from captured image

尝试从捕获的图像获取图像路径时遇到问题。 当我的相机按钮点击时:

takePickBtn.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            Intent cameraIntent = new Intent(
                    android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(Intent.createChooser(cameraIntent, "Select Picture"), REQUEST_IMAGE_CAPTURE);
        }
    });

然后,我尝试将捕获的图像加载到图像视图并获取字符串以将其传递到异步Http Post的代码:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    try {
        // When an Image is picked
        if (requestCode == REQUEST_IMAGE_CAPTURE
                && resultCode == RESULT_OK) {               
            final ContentResolver cr = getContentResolver();
            final String[] p1 = new String[] {
                MediaStore.Images.ImageColumns._ID,
                MediaStore.Images.ImageColumns.DATE_TAKEN
                    };
            Cursor c1 = cr.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, p1, null, null, p1[1] + " DESC");
            if ( c1.moveToFirst() ) {
            String uristringpic = "content://media/external/images/media/" +c1.getInt(0);
             Uri uri = Uri.parse(uristringpic);
                try {
                  Bitmap bm = android.provider.MediaStore.Images.Media.getBitmap(cr, uri);
                } finally {

                }
                params.put("filename", uristringpic);
            }
        } else {
            Toast.makeText(this, "You haven't picked Image",
                    Toast.LENGTH_LONG).show();
        }
    } catch (Exception e) {
        Toast.makeText(this, "Something went wrong", Toast.LENGTH_LONG)
                .show();
    }

}

但是,通过这样做,已将捕获的图像设置为图像视图。 但是,当我尝试打印uristringpic时,它是空的。 有任何想法吗?

提前致谢。

也许你应该尝试这样

Uri photoUri;

takePickBtn.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            Intent cameraIntent = new Intent(
                    android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
            photoUri = context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new ContentValues());
            cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
            startActivityForResult(Intent.createChooser(cameraIntent, "Select Picture"), REQUEST_IMAGE_CAPTURE);
        }
    });

现在,在拍摄图像后,您在photoUri var中有了图像uri。

如果您需要真实路径,请使用

public static String getPathFromMediaUri(@NonNull Context context, @NonNull Uri contentUri) {
    Cursor cursor = null;
    try {
        String[] proj = {MediaStore.Images.Media.DATA};
        cursor = context.getContentResolver().query(contentUri, proj, null, null, null);
        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    } finally {
        if (cursor != null) {
            cursor.close();
        }
    }
}

或者,您可以在启动相机意图之前插入putExtra uri,一旦用户拍摄了这样的照片,该图像将保存在其中

建立课程

public class UriHelper { 
Context mContext;

public UriHelper(Context context) {
    mContext = context;
}

// >> CHECK IF SD CARD IS MOUNTED 
// >> USE environment.getExternalStorageState() 

// 1) GET EXTERNAL STORAGE DIRECTORY 
// 2) CREATE THE SUBDIRECTORY 
// 3) CREATE A FILE NAME 
// 4) CREATE THE FILE AND RETURN ITS URI 
// >> use uri.fromFile()
public Uri getFileUri() {

    File mediaFile;
    if (isExternalStorageAvailable()) {
        // 1) Get the external storage directory

        String appName = mContext.getString(R.string.app_name);
        Log.i(LOGTAG, "app name is " + appName);
        File mediaStorageDir = new File(
                Environment
                        .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
                appName);

        // 2) Create our subdirectory
        if (!mediaStorageDir.exists()) {
            Log.i(LOGTAG, "Storage doest not exists");
            if (!mediaStorageDir.mkdirs()) {
                // Error
                Log.i(LOGTAG, "passed here");
                Log.e(LOGTAG, "Failed to create Directory");
                return null;
            }
        }
        // 3) Create a file name
        // 4) Create the file

        Date now = new Date();
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss",
                Locale.US).format(now);
        String path = mediaStorageDir.getPath() + File.separator;
        Log.i(LOGTAG, "Path is" + path);
        mediaFile = new File(path + "IMG_" + timeStamp + ".jpg");

        Log.i(LOGTAG, "Created :" + Uri.fromFile(mediaFile));
        return Uri.fromFile(mediaFile);
    } else
        Log.i(LOGTAG, "STORAGE NOT AVAILABLE");
    return null;
}

private boolean isExternalStorageAvailable() {
    boolean check = false;
    String state = Environment.getExternalStorageState();
    if (state.equals(Environment.MEDIA_MOUNTED)) {
        check = true;
    }
    return check;
  }
}

和你的活动

Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
                        UriHelper ur = new UriHelper( this );
                        mPhotoUri = ur.getFileUri(); 
                        if (mPhotoUri != null) {
                        takePhotoIntent .putExtra(MediaStore.EXTRA_OUTPUT, mPhotoUri);
                            startActivityForResult(takePhotoIntent, REQUEST_TAKE_PHOTO );
                        }else{
                            Toast.makeText( this , "There was an error",    Toast.LENGTH_LONG).show(); 
                        }

那么您可以直接使用uri路径在活动结果内部进行imageview

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM