dan*_*dim 5 android auto-update silent-installer packageinstaller
我知道这个问题有很多堆栈溢出帖子,但我无法使用其中任何一个来解决我的问题。
我的应用程序仅适用于有限的人群(公司内部应用程序),因此我无法在应用程序商店中发布它,并且我希望当我在应用程序服务器上发布新版本时它会自动更新。
这是一个device admin没有root权限的应用程序。我发现这种方法可以实现这个目标,但它不起作用。
我的文件中有此权限AndroidManifest.xml来安装软件包:
<uses-permission android:name="android.permission.INSTALL_PACKAGES" />
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
private void installPackage(Context context, String filePath, String packageName)
throws IOException
{
Log.d(TAG, "installPackage: start");
PackageInstaller packageInstaller = context.getPackageManager().getPackageInstaller();
PackageInstaller.SessionParams params = new PackageInstaller.SessionParams(
PackageInstaller.SessionParams.MODE_FULL_INSTALL);
params.setAppPackageName(packageName);
// set params
int sessionId = packageInstaller.createSession(params);
PackageInstaller.Session session = packageInstaller.openSession(sessionId);
//
InputStream in = new FileInputStream(new File(filePath));
OutputStream out = session.openWrite(packageName, 0, -1);
IOUtils.copyStream(in, out);
//
session.fsync(out);
in.close();
out.close();
//
session.commit(PendingIntent.getActivity(context, 112233, new Intent(context, MainActivity.class), PendingIntent.FLAG_UPDATE_CURRENT).getIntentSender());
Log.d(TAG, "installPackage: commit");
}
Run Code Online (Sandbox Code Playgroud)
这是onCreate我MainActivity班级的方法:
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
ComponentName componentName = new ComponentName(this, AdminReceiver.class);
DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
if (getIntent() != null && dpm != null)
{
Log.d(TAG, "onCreate: is app admin : " + dpm.isAdminActive(componentName));
Log.d(TAG, "onCreate: status : " + getIntent().getIntExtra("android.content.pm.extra.STATUS", 1000));
Log.d(TAG, "onCreate: intent : " + getIntent().getParcelableExtra("android.intent.extra.INTENT"));
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的logcat结果:
2019-07-08 15:03:24.147 5841-5841/com.test.learncheshmak D/AutoUpdateHelper: downloadUpdate: SUCCESSFUL
2019-07-08 15:03:24.147 5841-5841/com.test.learncheshmak D/AutoUpdateHelper: installPackage: start
2019-07-08 15:03:24.295 5841-5841/com.test.learncheshmak D/AutoUpdateHelper: installPackage: commit
2019-07-08 15:03:24.298 5841-5895/com.test.learncheshmak V/FA: Recording user engagement, ms: 11740
2019-07-08 15:03:24.302 5841-5841/com.test.learncheshmak W/ActivityThread: handleWindowVisibility: no activity for token android.os.BinderProxy@fe51cb8
2019-07-08 15:03:24.307 5841-5841/com.test.learncheshmak V/FA: onActivityCreated
2019-07-08 15:03:24.308 5841-5895/com.test.learncheshmak V/FA: Connecting to remote service
2019-07-08 15:03:24.308 5841-5841/com.test.learncheshmak D/MainActivity: onCreate: is app admin : true
2019-07-08 15:03:24.309 5841-5841/com.test.learncheshmak D/MainActivity: onCreate: status : -1
2019-07-08 15:03:24.309 5841-5841/com.test.learncheshmak D/MainActivity: onCreate: intent : Intent { act=android.content.pm.action.CONFIRM_PERMISSIONS pkg=com.google.android.packageinstaller (has extras) }
Run Code Online (Sandbox Code Playgroud)
在这里,正如我们所看到的,状态是-1。根据我得到的这份文件STATUS_PENDING_USER_ACTION,它确定我们需要用户提示来更新我们的应用程序。但这个应用程序是一个设备管理(设备所有者)应用程序,根据这份文件:
提交可能需要用户干预才能完成安装,除非调用者属于以下类别之一,在这种情况下安装将自动完成。
- 设备所有者
- 附属个人资料所有者
因此,如果应用程序device owner安装进度将自动执行(无需用户提示)。那么为什么我会得到STATUS_PENDING_USER_ACTION当我的应用程序是一个device admin应用程序时?
| 归档时间: |
|
| 查看次数: |
1510 次 |
| 最近记录: |