Android, получить изображение из галереи в imageView - PullRequest
0 голосов
/ 02 мая 2019

Я пытаюсь добавить фотографию из моей галереи, округлить изображение с помощью canvas и вставить в ImageView, но я всегда получаю эту ошибку:

ФАТАЛЬНОЕ ИСКЛЮЧЕНИЕ: основное Процесс: app.innova.cristobal.neton, PID: 8016 java.lang.RuntimeException: ошибка доставки результата ResultInfo {кто = ноль, запрос = 1, результат = -1, данные = намерение { DAT = содержание: //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)at java.lang.reflect.Method.invoke (собственный метод)

Это мой основной код:

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

}
}

И в моем файле манифеста я назначил эти разрешения:

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

Но он всегда возвращает мне нулевое растровое изображение.

Несколько советов о том, что не так с моим кодом?

Спасибо!

Ответы [ 2 ]

1 голос
/ 02 мая 2019
@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 () возвращает абстрактный путь.

0 голосов
/ 02 мая 2019

Добавить разрешение "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);

}}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...