简体   繁体   English

Android,从图库中获取图像到 imageView

[英]Android, get image from gallery into a imageView

I'm trying to add a photo from my gallery, round image with canvas and put intoa ImageView but I always get this error:我正在尝试从我的画廊添加一张照片,用画布将图像圆形并放入 ImageView,但我总是收到此错误:

FATAL EXCEPTION: main Process: app.innova.cristobal.neton, PID: 8016 java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent { dat=content://com.android.providers.media.documents/document/image:38 flg=0x1 }} to activity {app.innova.cristobal.neton/app.innova.cristobal.neton.Principal3Activity}: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.graphics.Bitmap.getWidth()' on a null object reference at android.app.ActivityThread.deliverResults(ActivityThread.java:3699) at android.app.ActivityThread.handleSendResult(ActivityThread.java:3742) at android.app.ActivityThread.-wrap16(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1393) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5417) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.Zygote致命异常:主进程:app.innova.cristobal.neton,PID:8016 java.lang.RuntimeException:未能传递结果 ResultInfo{who=null, request=1, result=-1, data=Intent { dat=content:/ /com.android.providers.media.documents/document/image:38 flg=0x1 }} 到活动 {app.innova.cristobal.neton/app.innova.cristobal.neton.Principal3Activity}: java.lang.NullPointerException: Attempt在 android.app.ActivityThread.deliverResults(ActivityThread.java:3699) at android.app.ActivityThread.handleSendResult(ActivityThread.java:3742) 的空对象引用上调用虚拟方法'int android.graphics.Bitmap.getWidth()' ) 在 android.app.ActivityThread.-wrap16(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1393) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android。 os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5417) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os。合子Init$MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.graphics.Bitmap.getWidth()' on a null object reference at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:610) at app.innova.cristobal.neton.Principal3Activity.onActivityResult(Principal3Activity.java:271) at android.app.Activity.dispatchActivityResult(Activity.java:6428) at android.app.ActivityThread.deliverResults(ActivityThread.java:3695) at android.app.ActivityThread.handleSendResult(ActivityThread.java:3742) at android.app.ActivityThread.-wrap16(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1393) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5417) at java.lang.reflect.Method.invoke(Native Method) Init$MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 由:java.lang.NullPointerException: Attempt to invoke virtual method 'int android.graphics .Bitmap.getWidth()' 在 android.graphics.Bitmap.createScaledBitmap(Bitmap.java:610) at app.innova.cristobal.neton.Principal3Activity.onActivityResult(Principal3Activity.java:271) at android.app 的空对象引用上.Activity.dispatchActivityResult(Activity.java:6428) at android.app.ActivityThread.deliverResults(ActivityThread.java:3695) at android.app.ActivityThread.handleSendResult(ActivityThread.java:3742) at android.app.ActivityThread.-wrap16 (ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1393) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java: 148) 在 android.app.ActivityThread.main(ActivityThread.java:5417) 在 java.lang.reflect.Method.invoke(Native Method)

This is my main code:这是我的主要代码:

        myimageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                Intent intent = new Intent();
                intent.setType("image/*");
                intent.setAction(Intent.ACTION_GET_CONTENT);
                startActivityForResult(Intent.createChooser(intent, "Select image"), 1);

            }
        });



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

        if (requestCode == 1 && resultCode == RESULT_OK) {

            Uri selectedImageUri = data.getData();
            imagepath = getPath(selectedImageUri);
            Bitmap bitmap=BitmapFactory.decodeFile(imagepath);

            ByteArrayOutputStream bytearrayoutputstream = new ByteArrayOutputStream();

            //Resized image
            Bitmap resizedBitmap = Bitmap.createScaledBitmap(bitmap, 150, 150, true);
            resizedBitmap.compress(Bitmap.CompressFormat.JPEG,50,bytearrayoutputstream);

            //Round image
            int min = Math.min(resizedBitmap.getWidth(), resizedBitmap.getHeight());

            Bitmap bitmapRounded = Bitmap.createBitmap(min, min, resizedBitmap.getConfig());

            Canvas canvas = new Canvas(bitmapRounded);
            Paint paint = new Paint();
            paint.setAntiAlias(true);
            paint.setShader(new BitmapShader(resizedBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP));
            canvas.drawRoundRect((new RectF(0.0f, 0.0f, min, min)), min / 2, min / 2, paint);


            myimageView.setImageBitmap(bitmapRounded);

}
}

And in my Manifest file I have assigned these permissions:在我的清单文件中,我分配了这些权限:

<uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

But it always return me a null bitmap.但它总是返回一个空位图。

Some advice about what's wrong with my code?关于我的代码有什么问题的一些建议?

Thank you!谢谢!

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

    if (requestCode == 1 && resultCode == RESULT_OK) {


            final Uri imageUri = data.getData();
            final InputStream imageStream = getContentResolver().openInputStream(imageUri);
            final Bitmap selectedImage = BitmapFactory.decodeStream(imageStream);

        ByteArrayOutputStream bytearrayoutputstream = new ByteArrayOutputStream();

        //Resized image
        Bitmap resizedBitmap = Bitmap.createScaledBitmap(bitmap, 150, 150, true);
        resizedBitmap.compress(Bitmap.CompressFormat.JPEG,50,bytearrayoutputstream);

        //Round image
        int min = Math.min(resizedBitmap.getWidth(), resizedBitmap.getHeight());

        Bitmap bitmapRounded = Bitmap.createBitmap(min, min, resizedBitmap.getConfig());

        Canvas canvas = new Canvas(bitmapRounded);
        Paint paint = new Paint();
        paint.setAntiAlias(true);
        paint.setShader(new BitmapShader(resizedBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP));
        canvas.drawRoundRect((new RectF(0.0f, 0.0f, min, min)), min / 2, min / 2, paint);


        myimageView.setImageBitmap(bitmapRounded);

} }

You need a content resolver to open an input stream to selected image URI.您需要一个内容解析器来打开选定图像 URI 的输入流。 Uri.getpath() returns an abstract path. Uri.getpath() 返回一个抽象路径。

Add Permission "checkPermissionREAD_EXTERNAL_STORAGE"添加权限“checkPermissionREAD_EXTERNAL_STORAGE”

        if (checkPermissionREAD_EXTERNAL_STORAGE(getContext())) {
        Intent intent = new Intent();
        intent.setType("image/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);
        startActivityForResult(Intent.createChooser(intent, "Select File"),GET_PIC_CODE);
    }






    public boolean checkPermissionREAD_EXTERNAL_STORAGE(
        final Context context) {
    int currentAPIVersion = Build.VERSION.SDK_INT;
    if (currentAPIVersion >= android.os.Build.VERSION_CODES.M) {
        if (ContextCompat.checkSelfPermission(context,
                Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            if (ActivityCompat.shouldShowRequestPermissionRationale(
                    (Activity) context,
                    Manifest.permission.READ_EXTERNAL_STORAGE)) {
                showDialog("External storage", context,
                        Manifest.permission.READ_EXTERNAL_STORAGE);

            } else {
                ActivityCompat
                        .requestPermissions(
                                (Activity) context,
                                new String[] { Manifest.permission.READ_EXTERNAL_STORAGE },
                                MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE);
            }
            return false;
        } else {
            return true;
        }

    } else {
        return true;
    }
}



    public void showDialog(final String msg, final Context context,
                       final String permission) {
    AlertDialog.Builder alertBuilder = new AlertDialog.Builder(context);
    alertBuilder.setCancelable(true);
    alertBuilder.setTitle("Permission necessary");
    alertBuilder.setMessage(msg + " permission is necessary");
    alertBuilder.setPositiveButton(android.R.string.yes,
            new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    ActivityCompat.requestPermissions((Activity) context,
                            new String[] { permission },
                            MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE);
                }
            });
    AlertDialog alert = alertBuilder.create();
    alert.show();
}


@Override
public void onRequestPermissionsResult(int requestCode,
                                       String[] permissions, int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE:
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // do your stuff
            } else {
                Toast.makeText(getContext(), "GET_ACCOUNTS Denied",
                        Toast.LENGTH_SHORT).show();
            }
            break;
        default:
            super.onRequestPermissionsResult(requestCode, permissions,
                    grantResults);
    }
}



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

    if (requestCode == 1 && resultCode == RESULT_OK) {

        Uri selectedImageUri = data.getData();
        imagepath = getPath(selectedImageUri);
        Bitmap bitmap=BitmapFactory.decodeFile(imagepath);

        ByteArrayOutputStream bytearrayoutputstream = new ByteArrayOutputStream();

        //Resized image
        Bitmap resizedBitmap = Bitmap.createScaledBitmap(bitmap, 150, 150, true);
        resizedBitmap.compress(Bitmap.CompressFormat.JPEG,50,bytearrayoutputstream);

        //Round image
        int min = Math.min(resizedBitmap.getWidth(), resizedBitmap.getHeight());

        Bitmap bitmapRounded = Bitmap.createBitmap(min, min, resizedBitmap.getConfig());

        Canvas canvas = new Canvas(bitmapRounded);
        Paint paint = new Paint();
        paint.setAntiAlias(true);
        paint.setShader(new BitmapShader(resizedBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP));
        canvas.drawRoundRect((new RectF(0.0f, 0.0f, min, min)), min / 2, min / 2, paint);


        myimageView.setImageBitmap(bitmapRounded);

} } } }

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

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