【问题标题】:Android, get image from gallery into a imageViewAndroid,从图库中获取图像到 imageView
【发布时间】:2019-05-02 07:42:24
【问题描述】:

我正在尝试从我的画廊中添加一张照片,用画布将图像圆形并放入 ImageView 但我总是收到此错误:

致命异常:主要 进程: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:尝试调用虚拟方法'int android.graphics.Bitmap.getWidth()' 在空对象引用上 在 android.app.ActivityThread.deliverResults(ActivityThread.java:3699) 在 android.app.ActivityThread.handleSendResult(ActivityThread.java:3742) 在 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(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 引起:java.lang.NullPointerException:尝试调用虚拟 空对象上的方法“int android.graphics.Bitmap.getWidth()” 参考 在 android.graphics.Bitmap.createScaledBitmap(Bitmap.java:610) 在 app.innova.cristobal.neton.Principal3Activity.onActivityResult(Principal3Activity.java:271) 在 android.app.Activity.dispatchActivityResult(Activity.java:6428) 在 android.app.ActivityThread.deliverResults(ActivityThread.java:3695) 在 android.app.ActivityThread.handleSendResult(ActivityThread.java:3742) 在 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)

这是我的主要代码:

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

}
}

在我的 Manifest 文件中,我分配了以下权限:

<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" />

但它总是返回一个空位图。

关于我的代码有什么问题的一些建议?

谢谢!

【问题讨论】:

    标签: android imageview


    【解决方案1】:
    @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);
    

    }

    您需要一个内容解析器来打开所选图像 URI 的输入流。 Uri.getpath() 返回一个抽象路径。

    【讨论】:

    • 完美,您的回答对我理解问题有很大帮助。除了已评论的内容外,我还结合验证用户是否在 Manifest 中具有权限。它奏效了!非常感谢!
    【解决方案2】:

    添加权限“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);
    

    } }

    【讨论】:

    • 谢谢曼尼什。你是如何定义 MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE 和 GET_PIC_CODE 的?
    • @Mimmetico private static final int GET_PIC_CODE = 1;公共静态最终 int MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE = 123;
    • 这会返回一个问题:java.lang.ClassCastException: android.app.Application cannot be cast to android.app.Activity at app.innova.cristobal.neton.Principal3Activity.checkPermissionREAD_EXTERNAL_STORAGE(Principal3Activity.java: 323) 在 app.innova.cristobal.neton.Principal3Activity$10.onClick(Principal3Activity.java:254)
    猜你喜欢
    • 1970-01-01
    • 2013-03-25
    • 2013-02-11
    • 1970-01-01
    • 1970-01-01
    • 2012-02-21
    • 2021-03-29
    • 2016-11-16
    相关资源
    最近更新 更多