App crashes when loading image from gallery

后端 未结 2 983
情歌与酒
情歌与酒 2021-01-26 15:45

In my app ,i have two buttons ,one for loading the image from gallery(from device )and another one for taking pictures by accesing the camera of the device,My code is working pr

相关标签:
2条回答
  • 2021-01-26 16:11

    This is issue in Lollypop+ devices so we have to write 2 logic to process LoolyPop below & above android versions to process the gallery Image.

    Starting Gallery Image Picker Intent,

    Intent intent = new Intent();
            intent.setType("image/*");
            intent.setAction(Intent.ACTION_GET_CONTENT);
            mContext.startActivityForResult(
                    Intent.createChooser(intent, "Complete action using"),
                    DigitalCareContants.IMAGE_PICK);
    

    Process the Image,

    • Method to receive Image Path :

      private static String getPath(final Context context, final Uri uri) {
      
      final boolean isKitKat = Build.VERSION.SDK_INT >= 19;
      
      
      if (isKitKat && DocumentsContract.isDocumentUri(uri)) {
      
          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];
              }
          }
      
          else if (isDownloadsDocument(uri)) {
      
              final String id = DocumentsContract.getDocumentId(uri);
              long mId = Long.parseLong(id);
              Uri mUri = Uri.parse("content://downloads/public_downloads");
              final Uri contentUri = ContentUris.withAppendedId(mUri, mId);
      
              return getDataColumn(context, contentUri, null, null);
          }
      
          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);
          }
      }
      
      else if ("content".equalsIgnoreCase(uri.getScheme())) {
          return getDataColumn(context, uri, null, null);
      }
      
      else if ("file".equalsIgnoreCase(uri.getScheme())) {
          return uri.getPath();
      }
      
      return null;}
      }
      
    • Received Gallery picker intent Processing :

          if(requestcode == 1000)
          {
          String[] filePathColumn = { MediaStore.Images.Media.DATA };
          Uri selectedImage = data.getData();
      
          if (Build.VERSION.SDK_INT >= 19) {
              InputStream input;
              Bitmap bitmap;
              String picturePath = getPath(mActivity, selectedImage);
              try {
                  input = mActivity.getContentResolver().openInputStream(
                          selectedImage);
                  bitmap = BitmapFactory.decodeStream(input);
                  Log.d("IMAGE", "Received Image Bitmap : " + bitmap);
                  Log.d("IMAGE", "Received Image Bitmap Path : " + picturePath);
              } catch (FileNotFoundException e1) {
      
              }
          } else {
              Log.d(TAG, "Android Version is 18 below");
              Cursor cursor = mActivity.getContentResolver().query(
                      selectedImage, filePathColumn, null, null, null);
              cursor.moveToFirst();
      
              int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
              String picturePath = cursor.getString(columnIndex);
              Log.d("IMAGE", "Received Image Bitmap Path : " + picturePath);
              BitmapFactory.Options options = new BitmapFactory.Options();
              options.inPreferredConfig = Bitmap.Config.ARGB_8888;
              Bitmap bitmap = BitmapFactory.decodeFile(picturePath, options);
              Log.d("IMAGE", "Received Image Bitmap : " + bitmap);
              Log.d("IMAGE", "Received Image Bitmap Path : " + picturePath);
              cursor.close();
          }
          }       
      

      - Note: Please make sure to add below class in your package. It has been copied from the Lollypop open source code.

        public class DocumentsContract {
        private static final String DOCUMENT_URIS =
      "com.android.providers.media.documents " +
      "com.android.externalstorage.documents " +
      "com.android.providers.downloads.documents " +
      "com.android.providers.media.documents";
      
      private static final String PATH_DOCUMENT = "document";
      private static final String TAG = DocumentsContract.class.getSimpleName();
      
      public static String getDocumentId(Uri documentUri) {
      final List<String> paths = documentUri.getPathSegments();
      if (paths.size() < 2) {
          throw new IllegalArgumentException("Not a document: " + documentUri);
      }
      
      if (!PATH_DOCUMENT.equals(paths.get(0))) {
          throw new IllegalArgumentException("Not a document: " + documentUri);
      }
      return paths.get(1);
      }
      
      public static boolean isDocumentUri(Uri uri) {
      final List<String> paths = uri.getPathSegments();
      Log.d(TAG, "paths[" + paths + "]");
      if (paths.size() < 2) {
          return false;
      }
      if (!PATH_DOCUMENT.equals(paths.get(0))) {
          return false;
      }
      return DOCUMENT_URIS.contains(uri.getAuthority());
      }
      }
      
    0 讨论(0)
  • 2021-01-26 16:17

    I'm not sure but... maybe on some device this "EXTERNAL_CONTENT_URI" doesn't work because there's no external storage?

    0 讨论(0)
提交回复
热议问题