繁体   English   中英

从图库加载图像时,应用崩溃

[英]App crashes when loading image from gallery

在我的应用程序中,我有两个按钮,一个用于从图库(从设备)加载图像,另一个用于通过访问设备的摄像头拍照。我的代码在某些设备上正常工作,在某些设备上,该应用程序单击图库中的图像时崩溃。有人可以帮助我找出实际的问题吗?

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>

我不确定,但是...也许在某些设备上,此“ EXTERNAL_CONTENT_URI”不起作用,因为没有外部存储?

这是Lollypop +设备中的问题,因此我们必须编写2个逻辑来处理低于和高于android版本的LoolyPop才能处理图库图像。

启动图库图片选择器意图,

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM