NullPointerException при получении URI для файла

159
14 июля 2019, 01:30

Нужно при клике на кнопке открыть приложение камеры, сделать снимок и сохранить его. Вот сам обработчик:

final Intent captureImage = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        boolean canTakePhoto = mPhotoFile != null && captureImage.resolveActivity(packageManager) != null;
        mPhotoButton.setEnabled(canTakePhoto);
        mPhotoButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View м) {
                Uri uri = FileProvider.getUriForFile(getActivity(),
                        "com.bignerdranch.android.criminalintent.fileprovider",
                        mPhotoFile);
                captureImage.putExtra(MediaStore.EXTRA_OUTPUT, uri);
                List<ResolveInfo> cameraActivities = getActivity().getPackageManager()
                        .queryIntentActivities(captureImage, PackageManager.MATCH_DEFAULT_ONLY);
                for (ResolveInfo activity : cameraActivities){
                    getActivity().grantUriPermission(activity.activityInfo.packageName,
                            uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
                }
                startActivityForResult(captureImage, REQUEST_PHOTO);
            }
        });

В строке

Uri uri = FileProvider.getUriForFile(getActivity(),
                            "com.bignerdranch.android.criminalintent.fileprovider",
                            mPhotoFile);

выкидывает NullPointerException, хотя в mPhotoFile не null. Как это исправить, в чем может быть проблема? Вот само исключение:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.XmlResourceParser android.content.pm.ProviderInfo.loadXmlMetaData(android.content.pm.PackageManager, java.lang.String)' on a null object reference

В манифесте объявил провайдер:

<provider
            android:authorities="com.bignerdrench.android.criminalintent.fileprovider"
            android:name="android.support.v4.content.FileProvider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/files" />
</provider>

Метод для получения имени файла:

public String getPhotoFilename() {
        return "IMG_" + getId().toString() + ".jpg";
    }

Метод для получения файла:

public File getPhotoFile(Crime crime){
        File filesDir = mContext.getFilesDir();
        return new File(filesDir, crime.getPhotoFilename());
    }

Что не так делаю, не пойму. Заранее благодарен за помощь.

READ ALSO
Сокеты. Прием от сервера массива данных

Сокеты. Прием от сервера массива данных

Имеется сервер который слушает команды от подключившихся клиентовПри обработке команды(запросов) клиенту отправляется массив данных

202
Добавить пункт в контекстное меню

Добавить пункт в контекстное меню

Возможно этот вопрос уже задавался, но я его так и не нашелКак добавить пункт в "глобальное" контекстное меню

189
приложение на javafx не отвечает

приложение на javafx не отвечает

Пишу прогу на java и графический интерфейс для нее на javafx все было хорошоНо в один момент начала выскакивать ошибка java tm platform se binary не отвечает

142
Проблема со сборкой ear архива с помощью Maven

Проблема со сборкой ear архива с помощью Maven

Создал заготовку под разработку Enterprise приложенияВ качестве сборщика приложения использую Maven

161