Ошибка «Не найдено действие для обработки намерения» при попытке сохранить изображение на внешнем хранилище в Android Java - PullRequest
0 голосов
/ 10 апреля 2020

Я пытаюсь сохранить изображение во внешнем хранилище из намерения MediaStore.ACTION_IMAGE_CAPTURE. Я получаю эту ошибку:

android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.media.action.IMAGE_CAPTURE dat=content://ca.kevincook.trackmytrip.fileprovider/DCIM/default_image.jpg flg=0x3 clip={text/uri-list U:content://ca.kevincook.trackmytrip.fileprovider/DCIM/default_image.jpg} (has extras) }

Вот мой код:

                Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                File imagePath = new File(getContext().getExternalFilesDir(Environment.DIRECTORY_DCIM), "");
                File newFile = new File(imagePath, "default_image.jpg");
                Uri contentUri = FileProvider.getUriForFile(getContext(), "ca.kevincook.trackmytrip.fileprovider", newFile);
                intent.putExtra(MediaStore.EXTRA_OUTPUT, contentUri);
                intent.setData(contentUri);
                getContext().grantUriPermission("ca.kevincook.trackmytrip", contentUri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
                getContext().grantUriPermission("ca.kevincook.trackmytrip", contentUri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
                intent.setFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
                intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                startActivityForResult(intent, 0);

Метод onActivityResult:

@Override
    public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 0)
        {
            if (resultCode == Activity.RESULT_OK)
            {

                Uri uri = data.getData();
                GalleryAdapter.addImage(BitmapFactory.decodeFile(uri.toString()));


            }
        }

        SaveImagePopup("Enter Picture Name");
    }

Объявление активности в файле манифеста:

        <activity   android:name=".MapsActivity" android:label="@string/title_activity_maps">
            <intent-filter>
                <action android:name="android.intent.action.IMAGE_CAPTURE" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>

Разрешения в файле манифеста:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-feature android:name = "android.hardware.camera"
        android:required="true"/>

provider_paths. xml

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="external_public_path" path="." />
</paths>

Я скопировал код именно с android сайта разработчика: https://developer.android.com/reference/androidx/core/content/FileProvider

Я использовал getContext (), потому что я запускаю его из фрагмента. Я также попробовал getActivity () вместо него, но это не сработало.

1 Ответ

0 голосов
/ 10 апреля 2020

Вы добавили файл, указанный в манифесте. Если нет, используйте его таким образом

<provider
    android:name=".fileprovider"
    android:authorities="com.xxxx.xxxx.xxxx" //Your package name
    android:enabled="true"
    android:exported="true" />

и можете обработать результат действия

Код в onActivityResult будет таким,

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

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

            File out = new File(getFilesDir(), "newImage.jpg");
            if (!out.exists()) {
                Toast.makeText(getBaseContext(), "Error while capturing image", Toast.LENGTH_LONG).show();

                return;
            }

            Bitmap mBitmap =     BitmapFactory.decodeFile(compressedImage.getAbsolutePath());

           ivShowImage.setImageBitmap(mBitmap);
    }
}
...