Приложение загружается при загрузке изображения из галереи

В моем приложении у меня есть две кнопки: одна для загрузки изображения из галереи (с устройства), а другая для съемки с помощью камеры устройства. Мой код работает правильно на некоторых устройствах, а на некоторых устройствах, приложение вылетает при щелчке изображения в галерее. Может кто-нибудь помочь мне узнать фактическую информацию?

public class MainActivity extends ActionBarActivity {
private static int RESULT_LOAD_IMAGE = 1;
private static final int CAMERA_REQUEST = 1888;
private ImageView imageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_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);
        }
    });
    this.imageView = (ImageView)this.findViewById(R.id.imgView);
    Button photoButton = (Button) this.findViewById(R.id.button2);
    photoButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(cameraIntent, CAMERA_REQUEST);
        }
    });
}

И xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent">
<ImageView android:id="@+id/imgView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_weight="1"></ImageView>
<RelativeLayout
    android:id="@+id/relativeLayout1"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="@android:color/black" >
<Button android:id="@+id/buttonLoadPicture"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"

    android:layout_weight="0"
    android:text="Load Picture"
    android:layout_gravity="center"></Button>
    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Take Picture"
        android:layout_alignParentRight="true"/>

</RelativeLayout>

Ответ 1

Я не уверен, но... возможно, на каком-то устройстве этот "EXTERNAL_CONTENT_URI" не работает, потому что нет внешнего хранилища?

Ответ 2

Это проблема в устройствах Lollypop +, поэтому нам нужно написать 2 логики для обработки LoolyPop ниже и выше версий Android для обработки изображения галереи.

Запуск настройки образа изображения галереи,

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

Обработать изображение,

  • Способ получения пути к изображению:

    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;}
    }
    
  • Назначение сборщика полученных изображений Обработка:

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

    - Примечание. Обязательно добавьте ниже класс в свой пакет. Он был скопирован из открытого исходного кода Lollypop.

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