android - 如何从图库中获取所选图像的路径

标签 android

我正在创建一个将图像上传到服务器的应用程序。 选择图像时出现以下异常。

方法抛出“android.database.sqlite.SQLiteException”异常..

near "FROM": syntax error (code 1): , while compiling: SELECT  FROM images WHERE (_id=?)

打开图库的代码:

  Intent intent = new Intent(Intent.ACTION_PICK);
            intent.setType("image/*");
            startActivityForResult(intent, IMAGE_PICKER);

关于 Activity 结果

  Uri selectedImage = data.getData();
        String[] filePathColumn = { MediaStore.Images.Media.DATA };
        Cursor cursor = getContentResolver().query(selectedImage,filePathColumn, null, null, null);
        cursor.moveToFirst();
        int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
        String picturePath = cursor.getString(columnIndex);
        cursor.close();
        ImageView imageView = (ImageView) findViewById(R.id.imgView);
        imageView.setImageBitmap(BitmapFactory.decodeFile(picturePath));

最佳答案

当您使用 ContentProvider 选择任何图像时,您得到的是该图像的 URI。您需要将此 URI 转换为 *绝对路径*:

您可以使用以下 util 将任何文件的 URI 转换为绝对路径:

public class RealPathUtil {

    @SuppressLint("NewApi")
    public static String getRealPathFromURI_API19(Context context, Uri uri){
        String filePath = "";
        String wholeID = DocumentsContract.getDocumentId(uri);

         // Split at colon, use second item in the array
         String id = wholeID.split(":")[1];

         String[] column = { MediaStore.Images.Media.DATA };     

         // where id is equal to             
         String sel = MediaStore.Images.Media._ID + "=?";

         Cursor cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
                                   column, sel, new String[]{ id }, null);

         int columnIndex = cursor.getColumnIndex(column[0]);

         if (cursor.moveToFirst()) {
             filePath = cursor.getString(columnIndex);
         }   
         cursor.close();
         return filePath;
    }


    @SuppressLint("NewApi")
    public static String getRealPathFromURI_API11to18(Context context, Uri contentUri) {
          String[] proj = { MediaStore.Images.Media.DATA };
          String result = null;

          CursorLoader cursorLoader = new CursorLoader(
                  context, 
            contentUri, proj, null, null, null);        
          Cursor cursor = cursorLoader.loadInBackground();

          if(cursor != null){
           int column_index = 
             cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
           cursor.moveToFirst();
           result = cursor.getString(column_index);
          }
          return result;  
    }

    public static String getRealPathFromURI_BelowAPI11(Context context, Uri contentUri){
               String[] proj = { MediaStore.Images.Media.DATA };
               Cursor 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);
    }
}

更多信息,请查看教程here .

关于android - 如何从图库中获取所选图像的路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42344154/

相关文章:

Android - clickableSpan 和 TextView 的问题

android - Android应用程序中使用的类加载器

javascript - JavaScript 中的 hr 标签

Android:每次单击抽屉导航项时创建一个新 fragment 更好还是加载以前创建的 fragment ?

java - Android - 创建文件夹时出错

java - map 就绪回调返回 null

java - PNG 纹理未在 HTC desire 上加载

android用渐变创建饼图

java - 在 Android Studio 中配对蓝牙设备

android - sqlite 求和来自同一日期的值并返回 1 行