2015-10-08 125 views
1

我试图从图库中选择图像并将其设置为imageview。从图库中挑选图像并设置为图像视图

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    try { 
     // When an Image is picked 
     if (requestCode == RESULT_LOAD_IMG && resultCode == RESULT_OK 
       && null != data) { 

      Log.e("1","1"); 
      // Get the Image from data 

      Uri selectedImage = data.getData(); 
      Log.e("2","2"); 

      String[] filePathColumn = { MediaStore.Images.Media.DATA }; 
      Log.e("3","3"); 

      // Get the cursor 
      Cursor cursor = getContentResolver().query(selectedImage, 
        filePathColumn, null, null, null); 
      Log.e("4","4"); 
      // Move to first row 
      cursor.moveToFirst(); 
      Log.e("5", "5"); 

      int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
      Log.e("6","6"); 
      imgDecodableString = cursor.getString(columnIndex); 
      Log.e("7","7"); 
      cursor.close(); 
      ImageView imgView = (ImageView) findViewById(R.id.imgView); 
      Log.e("8","8"); 
      // Set the Image in ImageView after decoding the String 
      imgView.setImageBitmap(BitmapFactory 
        .decodeFile(imgDecodableString)); 

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

} 

在日志中,仅显示第三日志后,显示其土司在渔获物。我使用的是三星S4,而Android版本是5.0.1。 我认为,问题是关于游标,但无法修复它。请帮帮我。

+0

您是否添加了读取外部存储的权限? – Jas

+0

在您的catch块中打印stacktrace并将其发布到此处。 –

+0

我把这两个权限之前的活动“<使用权限android:name =”android.permission.READ_EXTERNAL_STORAGE“/> ” – JavadKhan

回答

0

这是我用过提货库图片则显示它ImageView代码。你可以根据你的需要使用。

这里是打开Gallery Intent的方法。

private static final int GALLERY_PHOTO = 111; 

private void pickGalleryImage() { 
    Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
    intent.setType("image/*"); 
    startActivityForResult(chooserIntent, GALLERY_PHOTO); 
} 

那么你的onActivityResult()方法应该是这样的。在这个方法中mContext指的是Activity的上下文。如果Activity名字是MainActivity那么你可以使用MainActivity.this

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     if (requestCode == GALLERY_PHOTO && resultCode == Activity.RESULT_OK) { 
      if (data.getData() != null) { 
       String filePath = GetFilePathFromDevice.getPath(mContext, data.getData()); 
       Bitmap bm = BitmapFactory.decodeFile(filePath); 
       imgView.setImageBitmap(bm); 
      }  
     } 
} 

这里是onActivityResult()方法用于从画廊得到选择的图像的文件路径GetFilePathFromDevice类。

public final class GetFilePathFromDevice { 

    /** 
    * Get file path from URI 
    * 
    * @param context context of Activity 
    * @param uri  uri of file 
    * @return path of given URI 
    */ 
    public static String getPath(final Context context, final Uri uri) { 
     final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT; 
     // DocumentProvider 
     if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) { 
      // ExternalStorageProvider 
      if (isExternalStorageDocument(uri)) { 
       final String docId = DocumentsContract.getDocumentId(uri); 
       final String[] split = docId.split(":"); 
       final String type = split[0]; 
       if ("primary".equalsIgnoreCase(type)) { 
        return Environment.getExternalStorageDirectory() + "/" + split[1]; 
       } 
      } 
      // DownloadsProvider 
      else if (isDownloadsDocument(uri)) { 
       final String id = DocumentsContract.getDocumentId(uri); 
       final Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(id)); 
       return getDataColumn(context, contentUri, null, null); 
      } 
      // MediaProvider 
      else if (isMediaDocument(uri)) { 
       final String docId = DocumentsContract.getDocumentId(uri); 
       final String[] split = docId.split(":"); 
       final String type = split[0]; 
       Uri contentUri = null; 
       if ("image".equals(type)) { 
        contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; 
       } else if ("video".equals(type)) { 
        contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; 
       } else if ("audio".equals(type)) { 
        contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 
       } 
       final String selection = "_id=?"; 
       final String[] selectionArgs = new String[]{split[1]}; 
       return getDataColumn(context, contentUri, selection, selectionArgs); 
      } 
     } 
     // MediaStore (and general) 
     else if ("content".equalsIgnoreCase(uri.getScheme())) { 
      // Return the remote address 
      if (isGooglePhotosUri(uri)) 
       return uri.getLastPathSegment(); 
      return getDataColumn(context, uri, null, null); 
     } 
     // File 
     else if ("file".equalsIgnoreCase(uri.getScheme())) { 
      return uri.getPath(); 
     } 
     return null; 
    } 

    public static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) { 
     Cursor cursor = null; 
     final String column = "_data"; 
     final String[] projection = {column}; 
     try { 
      cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null); 
      if (cursor != null && cursor.moveToFirst()) { 
       final int index = cursor.getColumnIndexOrThrow(column); 
       return cursor.getString(index); 
      } 
     } finally { 
      if (cursor != null) 
       cursor.close(); 
     } 
     return null; 
    } 

    public static boolean isExternalStorageDocument(Uri uri) { 
     return "com.android.externalstorage.documents".equals(uri.getAuthority()); 
    } 

    public static boolean isDownloadsDocument(Uri uri) { 
     return "com.android.providers.downloads.documents".equals(uri.getAuthority()); 
    } 

    public static boolean isMediaDocument(Uri uri) { 
     return "com.android.providers.media.documents".equals(uri.getAuthority()); 
    } 

    public static boolean isGooglePhotosUri(Uri uri) { 
     return "com.google.android.apps.photos.content".equals(uri.getAuthority()); 
    } 
} 

我希望它可以帮助你。

+0

我也试过这个,把try catch,它给了这个异常“android.content.ContentResolver android.content.Context.getContentResolver()” – JavadKhan

+0

ActivityResult中'mContext'是什么,你初始化它吗? – JavadKhan

+0

活动的名称是什么? – Rajesh

1

试试这个

private static int RESULT_LOAD_IMAGE = 1; 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     Button buttonLoadImage = (Button) findViewById(R.id.buttonLoadPicture); 
     buttonLoadImage.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 

       Intent i = new Intent(
         Intent.ACTION_PICK, 
         android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 

       startActivityForResult(i, RESULT_LOAD_IMAGE); 
      } 
     }); 
    } 


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

     if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) { 
      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)); 

     } 


    } 
} 
+0

同样的问题,在Cursor查询行。 – JavadKhan

+0

你得到了什么错误?post logcat或erros –

+0

这个错误“java.lang.NullPointerException:试图调用虚拟方法'android.content.ContentResolver android.content.Context.getContentResolver()'null对象引用 ” – JavadKhan

相关问题