【问题标题】:Getting Image from gallery in android从android中的画廊获取图像
【发布时间】:2015-01-30 05:02:24
【问题描述】:

我一直在尝试从这个应用程序的图库中获取图像,然后单击一个按钮,我想上传到我的 PHP 服务器。

为什么“selectedImagePath”为空? 如果有人有解决方案,请帮助我!提前致谢。

onCreate()

img = (ImageView) findViewById(R.id.ImageView01);
        Button browse = (Button) findViewById(R.id.Button01);

        browse.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.setType("image/*");
                intent.setAction(Intent.ACTION_GET_CONTENT);
                startActivityForResult(Intent.createChooser(intent, "Select Picture"), SELECT_PICTURE);
            }
        });

onActivityResult()

public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == RESULT_OK) {
            if (requestCode == SELECT_PICTURE) {
                selectedImageUri = data.getData();
                System.out.println(selectedImageUri);
                selectedImagePath = getPath(selectedImageUri);//returns as null
                System.out.println("Image Path : " + selectedImagePath);
                img.setImageURI(selectedImageUri);
            }
        }
    }

getPath()

public String getPath(Uri uri) {
        String[] projection = {MediaStore.Images.Media.DATA};
        Cursor cursor = managedQuery(uri, projection, null, null, null);
        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    }

【问题讨论】:

  • 您的getPath() 方法在哪里?您是否在清单文件中添加了write and read external storage 权限?

标签: android android-intent android-gallery


【解决方案1】:

试试这个

@Override
public void onClick(View view) {
    Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    intent.setType("image/*");
    startActivityForResult(intent, 0);
}

@Override
 protected void onActivityResult(int reqCode, int resCode, Intent data) {
    if(resCode == Activity.RESULT_OK && data != null){
        String realPath;
        // SDK < API11
        if (Build.VERSION.SDK_INT < 11) {
            realPath = RealPathUtil.getRealPathFromURI_BelowAPI11(this, data.getData());
        }

        // SDK >= 11 && SDK < 19
        else if (Build.VERSION.SDK_INT < 19) {
            realPath = RealPathUtil.getRealPathFromURI_API11to18(this, data.getData());
        }

        // SDK > 19 (Android 4.4)
        else {
            realPath = RealPathUtil.getRealPathFromURI_API19(this, data.getData());
        }
        System.out.println("Image Path : " + realPath);
    }
}


public class RealPathUtil {

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

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

getRealPath类的代码不是我的,网址我就不写了。

【讨论】:

  • 在哪里可以找到 RealPathUtil
【解决方案2】:

当您获取数据时,首先从该路径创建文件,然后将该文件的路径获取为“selectedImagePath”。然后你会得到图像在外部存储上的实际路径:试试下面的代码:

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_OK) {
        if (requestCode == SELECT_PICTURE) {
            selectedImageUri = data.getData();
            File myFile = new File(selectedImageUri);
            System.out.println(selectedImageUri);
            selectedImagePath = myFile.getPath();
            System.out.println("Image Path : " + selectedImagePath);
            img.setImageURI(selectedImageUri);
        }
    }
}

【讨论】:

    【解决方案3】:

    试试这个代码,

    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == RESULT_OK) {
            if (requestCode == SELECT_PICTURE) {
                Uri selectedImageUri = data.getData();
                selectedImagePath = getPath(selectedImageUri);
                System.out.println("Image Path : " + selectedImagePath);
                img.setImageURI(selectedImageUri);
            }
        }
    }
    
    public String getPath(Uri uri) {
        String[] projection = { MediaStore.Images.Media.DATA };
        Cursor cursor = managedQuery(uri, projection, null, null, null);
        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    }
    

    【讨论】:

      【解决方案4】:

      试试下面的代码

      if (resultCode == RESULT_OK) {
          if (requestCode == SELECT_PICTURE) {
                  Uri uri = data.getData();
                  String[] filepath = { MediaStore.Images.Media.DATA };
                  Cursor cursor = getContentResolver().query(uri, filepath, null,
                          null, null);
                  cursor.moveToFirst();
      
                  int columnIndex = cursor.getColumnIndex(filepath[0]);
                  String filePath = cursor.getString(columnIndex);
                  cursor.close();
                  System.out.println("Image Path : " + filePath);
      
              }
      

      【讨论】:

        【解决方案5】:

        我在这个问题上花了一些时间,最终我找到了完全可行的解决方案()。

        答. 它取自 cordova-plugin-camera,可在此处找到:

        public static String getRealPath(final Uri uri, final Context context) {
            String realPath = null;
        
            if (Build.VERSION.SDK_INT < 11) {
                realPath = FileHelper.getRealPathFromURI_BelowAPI11(context, uri);
        
                // SDK >= 11
            } else {
                realPath = FileHelper.getRealPathFromURI_API11_And_Above(context, uri);
            }
        
            return realPath;
        }
        

        这两种方法都在 [FileHelper.class] 中提供: https://github.com/apache/cordova-plugin-camera/blob/06d609cfa4871b4a2811f5a8f7f0a822733209b9/src/android/FileHelper.java

        我不想复制代码,而是提供了链接,因为解决方案非常复杂。 /我认为它们可能会过期,但希望它们不会/

        乙。 以下是示例项目 [RealPathUtil.java] 的源代码链接:https://github.com/hmkcode/Android/blob/master/android-show-image-and-path/src/com/hmkcode/android/image/RealPathUtil.java

        C. 这里的另一个问题没有引起太多关注。 [堆栈溢出帖]:https://stackoverflow.com/a/36714242

        【讨论】:

          猜你喜欢
          • 2012-12-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-02-03
          • 2012-02-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多