3 java android android-intent apk
我在尝试在 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;
}
Run Code Online (Sandbox Code Playgroud)
在我的视图模型类中:
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;
}
Run Code Online (Sandbox Code Playgroud)
但是,当我执行上面的代码时,没有显示错误消息,并且版本升级也不起作用。它基本上只是重新启动意图,根本没有升级。
它也不会提示我安装新版本的权限。有任何想法吗?
顺便说一句,我的 Android 模拟器没有 root,因此我无法使用“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);
Run Code Online (Sandbox Code Playgroud)
我从 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
Run Code Online (Sandbox Code Playgroud)
意图错误消息告诉我“解析包时出现问题”。
你可以尝试合并
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Run Code Online (Sandbox Code Playgroud)
进入
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_ACTIVITY_NEW_TASK);
Run Code Online (Sandbox Code Playgroud)
我遇到了和你一样的问题,这个解决方案救了我自己。
| 归档时间: |
|
| 查看次数: |
4510 次 |
| 最近记录: |