簡體   English   中英

權限拒絕:打開提供程序android.support.v4.content.FileProvider

[英]Permission Denial: opening provider android.support.v4.content.FileProvider

嘗試在Android模擬器中執行應用程序升級時遇到問題。 該場景的流程來自Activity,我將執行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;
 }

但是,當我執行上述代碼時,未顯示任何錯誤消息,並且版本升級也無法正常進行。 它基本上只是重新啟動意圖,根本沒有升級。

它也不會提示我安裝新版本的權限。 有任何想法嗎?

順便說一句,我的android仿真器沒有植根,因此我不能使用“ 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

意圖錯誤消息告訴我“解析程序包時出現問題”。

您可以嘗試合並

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);

我遇到了與您相同的問題,此解決方案使我自救了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM