Показать фотографию из FileProvider с Intent.ACTION_VIEW - PullRequest
0 голосов
/ 08 января 2019

Я работаю на устройстве под управлением Android 8.1.0. Я пытаюсь открыть изображение из вложения сообщения. У меня был кэш файлов изображений, работавший с использованием FileProvider неделю назад, и теперь он просто перестал работать без моего прикосновения к коду. Я пытаюсь отправить изображение из внутреннего хранилища приложения в Intent.ACTION_VIEW вне моего приложения. Программа просмотра фотографий запускается, но есть круг прогресса, который просто продолжает вращаться. Какие-либо предложения? Спасибо!

void launchViewer(File f) {
    Uri uri = FileProvider.getUriForFile(context, "com.company.secure.provider", f);
    Intent intent = new Intent(Intent.ACTION_VIEW);
    String mimeType =  Attachment.getMimeType(f.getName());
    //TODO Test to make sure this works on all devices...
    if (mimeType.startsWith("video")) {
        mimeType = "video/*";
    }

    if (mimeType.startsWith("image")) {
        mimeType = "image/*";
    }

    if(mimeType==null || mimeType.length()==0) {
        unknownMimeType(f.getName());
        return;
    }
    List<ResolveInfo> resInfoList = context.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
    if(resInfoList==null || resInfoList.size()==0)
    {
        AlertDialog dialog = new AlertDialog.Builder(context).setTitle("Error")
                .setMessage(String.format("Cannot find app to open file type(%s)",mimeType)).show();
        return;
    }
    for (ResolveInfo resolveInfo : resInfoList) {
        String packageName = resolveInfo.activityInfo.packageName;
        context.grantUriPermission(packageName, uri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
    }
    intent.setDataAndType(uri, mimeType);
    context.startActivity(intent);
}

Stack Trace

1 Ответ

0 голосов
/ 09 января 2019

Так что мне просто нужно было добавить следующую строку прямо перед началом упражнения.

intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

По какой-то причине APK, который я отправил на тестирование и в котором нет этой строки, работает ... но любая новая сборка не работает без этого. Я читал, что использование метода ResolveInfo будет работать только для Lollipop и ниже, и вам придется предоставить разрешение непосредственно для намерения. (Не уверен, насколько это правда). По этой причине я оставил там оба способа предоставления разрешений, чтобы охватить все базы. Спасибо за помощь!

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