Исключение нулевого указателя при съемке на Android Api> = 23 - PullRequest
0 голосов
/ 12 февраля 2019

Я много искал, но мне ничего не помогло, поэтому я отправляю свой собственный вопрос.

Моя проблема заключается в том, что при съемке в Android Marshmallow и более поздних версиях он выдает ошибку

java.lang.NullPointerException: uri

Примечание: работает нормально ниже уровня API 22 * ​​1009 *

Мой код

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

    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == this.RESULT_CANCELED) {
        return;
    }

    if (requestCode == GALLERY) {
        filePath = data.getData();
Uri uri = data.getData();
                // imageView.setImageURI(uri);
                try {

                    Log.d("waqarr",""+ Arrays.toString(convert(getPath(filePath))));
                    File f = new File(getPath(filePath));
                    file_name = f.getName();

                    Uri selectedImage = data.getData();
                    //ShowImageDialog();
                    if(filePath!= null)
                    {
                        multipart();
                    }
                    } catch (IOException e) {
                    e.printStackTrace();
                }
    }
    } else if (requestCode == CAMERA) {
        Bitmap photo = (Bitmap) data.getExtras().get("data");

       // filePath = getImageUri(getApplicationContext(), photo);
        filePath = data.getData();
        try {

            Log.d("waqarr", "  " + Arrays.toString(convert(getPath(filePath))));
            File f = new File(getPath(filePath));
            file_name = f.getName();

            multipart();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }} public String getPath(Uri uri)
{
    String[] filePathColumn = {MediaStore.Images.Media.DATA};
    Cursor cursor = getContentResolver().query(uri, filePathColumn, null, null, null);
    cursor.moveToFirst();
    String document_id = cursor.getString(0);
    document_id = document_id.substring(document_id.lastIndexOf(":") + 1);
    cursor.close();
    cursor = getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
            null, MediaStore.Images.Media._ID + " = ? ", new String[]{document_id}, null);
    cursor.moveToFirst();
    String path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
    cursor.close();
    return path;
}

Любая помощь будетоценили.

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Добавьте приведенный ниже код в свой фрагмент / действие, чтобы выбрать изображение с камеры или галереи.Это значения int для вашего запроса камеры или галереи

public static final int MY_PERMISSIONS_REQUEST_CAMERA = 001;
public static final int MY_PERMISSIONS_REQUEST_EXTERNAL_STORAGE = 002;

Пользовательский класс камеры Android для установки аспектов и фиксированного размера изображения с камеры

Camera camera;
camera = new Camera.Builder()
            .resetToCorrectOrientation(true) // it will rotate the camera bitmap to the correct orientation from meta data
            .setTakePhotoRequestCode(1)
            .setDirectory("pics")
            .setName("PicName_" + System.currentTimeMillis())
            .setImageFormat(Camera.IMAGE_JPEG)
            .setCompression(75)
            .setImageHeight(1000) // it will try to achieve this height as close as possible maintaining the aspect ratio;
            .build(this);

Проверьте необходимые разрешения

if (ContextCompat.checkSelfPermission(getContext(),
            Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {

        if (ActivityCompat.shouldShowRequestPermissionRationale((Activity)
                getContext(), Manifest.permission.CAMERA)) {


        } else {
            ActivityCompat.requestPermissions((Activity) getContext(),
                    new String[]{Manifest.permission.CAMERA},
                    MY_PERMISSIONS_REQUEST_CAMERA);
        }
    }

 if (ContextCompat.checkSelfPermission(getContext(),
            Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {

        if (ActivityCompat.shouldShowRequestPermissionRationale((Activity)
                getContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE)) {


        } else {
            ActivityCompat.requestPermissions((Activity) getContext(),
                    new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                    MY_PERMISSIONS_REQUEST_EXTERNAL_STORAGE);
        }
    }

Выберите изображение из галереи

/* Choose an image from Gallery */
void openImageChooser() {
    Intent intent = new Intent(Intent.ACTION_PICK);
    intent.setType("image/*");
    startActivityForResult(intent, SELECT_PICTURE);
}

Сделайте снимок с камеры

textCamera.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            try {
                camera.takePicture();
            }catch (Exception e){
                e.printStackTrace();
            }

            dialog.dismiss();
        }
    });

В результате активности получите выбранное изображение в виде растрового изображения / base64 по вашему выбору

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == SELECT_PICTURE && resultCode == RESULT_OK) {
        try {
            final Uri imageUri = data.getData();
            final InputStream imageStream = getActivity().getContentResolver().openInputStream(imageUri);
            final Bitmap selectedImage = BitmapFactory.decodeStream(imageStream);

            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            selectedImage.compress(Bitmap.CompressFormat.PNG, 40, byteArrayOutputStream);
            byte[] byteArray = byteArrayOutputStream.toByteArray();
            Log.e("byte_array ", byteArray.toString());
            imgBase = Base64.encode(byteArray);

            imagePath = "data:image/png;base64," + imgBase;

            Log.e("path_of_gallery", imgBase.toString());

            // Set the image in ImageView
            imgUserProfilePicture.setImageBitmap(selectedImage);

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    } else {

        Bitmap bitmap = camera.getCameraBitmap();
        if(bitmap != null) {
            imgUserProfilePicture.setImageBitmap(bitmap);

            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            bitmap.compress(Bitmap.CompressFormat.JPEG, 40, byteArrayOutputStream);
            byte[] byteArray = byteArrayOutputStream.toByteArray();
            Log.e("byte_array ", byteArray.toString());
            imgBase = Base64.encode(byteArray);
            imagePath = "data:image/png;base64," + imgBase;

            Log.e("path_of_camera_img", imgBase.toString());
        }else{
            Toast.makeText(context,"Picture not taken!",Toast.LENGTH_SHORT).show();
        }
    }
}
0 голосов
/ 12 февраля 2019

сначала создайте объект для URI, затем вы не получите исключение нулевого указателя и отладите их

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