Отказ в разрешении: открытие провайдера android.support.v4.content.FileProvider - PullRequest
0 голосов
/ 11 июня 2018

У меня возникли проблемы при попытке выполнить обновление приложения в эмуляторе Android.Поток сценария из Действия, я выполню AsyncTask A , который открывает фрагмент A , затем внутри AsyncTask A , я проверю, если обновление версиидоступен.

Если доступно и пользователь выбрал «Хорошо» из фрагмента A , я перейду к AsyncTask B , чтобы открыть фрагмент B , который показываетсообщение пользователю о том, что обновление выполняется.В AsyncTask B doInBackground () я выполню install () , а в onPostExecute () я покажу успешное сообщение.

В моей AsyncTask B, где я выполняю установку:

@Override
protected Boolean doInBackground(Void... params) {
boolean ret= viewmodel.installApk(mActivity);
return ret;
}

В моем классе модели представления:

public boolean installApk(Activity mActivity){
    boolean success = false;
    String fullPath = scanDirectoryForApk();

    System.out.println("INSTALLING APK ......................... ");

    Intent intent = new Intent(Intent.ACTION_VIEW);
    Uri apkURI = FileProvider.getUriForFile(mActivity, mActivity.getApplicationContext().getPackageName() + ".provider", new File(fullPath));
    intent.setDataAndType(apkURI, "application/vnd.android.package-archive");
    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    mActivity.startActivity(intent);
    return true;
 }

Однако, когда я выполняю код выше, нетбыло показано сообщение об ошибке, и обновление версии также не работает.Это в основном просто перезапустить намерение, и нет никакого обновления вообще.

Также не запрашивается разрешение на установку новой версии.Есть идеи?

Кстати, мой эмулятор андроида не рутирован и поэтому я не смог использовать подход команды "su".

Спасибо!

РЕДАКТИРОВАТЬ

В соответствии с предложением @Sagar, я изменил свой код выше:

Intent intent = new Intent(Intent.ACTION_VIEW);
    Uri apkURI = FileProvider.getUriForFile(mActivity, mActivity.getApplicationContext().getPackageName() + ".provider", new File(fullPath));

    List<ResolveInfo> resInfoList = mActivity.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
    for (ResolveInfo resolveInfo : resInfoList) {
        String packageName = resolveInfo.activityInfo.packageName;
        mActivity.grantUriPermission(packageName, apkURI, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
    }

    intent.setDataAndType(apkURI, "application/vnd.android.package-archive");
    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    mActivity.startActivity(intent);

И я получаю новое сообщение об ошибке от logcat:

Error staging apk from content URI
java.lang.SecurityException: Permission Denial: opening provider android.support.v4.content.FileProvider from ProcessRecord{3883c8 9647:com.google.android.packageinstaller/u0a20} (pid=9647, uid=10020) that is not exported from UID 10085

Сообщение об ошибке намерения сообщает мне «Произошла ошибка при разборе пакета».

1 Ответ

0 голосов
/ 01 июля 2019

Вы можете попытаться объединить

intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

в

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

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

...