请求安装未知来源Apk
使用AndPermission也需要在manifest.xml
中添加android.permission.REQUEST_INSTALL_PACKAGES
权限,并且调用AndPermission
的安装代码之前需要保证App拥有外部存储设备读写权限。
最简单的情况,只需要传入apk文件路径即可完成整个安装流程:
File file = ...;
AndPermission.with(this)
.install()
.file(file)
.start();
此时如果没有安装未知来源应用的权限,AndPermission将会自动启动安装权限设置页面让用户授权。
如果开发者想把体验做的更好一点,例如没有权限时弹一个Dialog
让用户选择是否启动设置,用户同意或者拒绝后做一个统计:
File apkFile = ...;
AndPermission.with(this)
.install()
.file(apkFile)
.rationale(new Rationale<File>() {
@Override
public void showRationale(Context c, File f, RequestExecutor e) {
// 没有权限会调用该访问,开发者可以在这里弹窗告知用户无权限。
// 启动设置:e.execute();
// 取消启动:e.cancel();
}
})
.onGranted(new Action<File>() {
@Override
public void onAction(File data) {
}
})
.onDenied(new Action<File>() {
@Override
public void onAction(File data) {
}
})
.start();
当showRationale()
被回调后说明没有REQUEST_INSTALL_PACKAGES
权限,此时开发者必须回调RequestExecutor#execute()
来启动设置或者RequestExecutor#cancel()
来取消启动设置,否则将不会回调onGranted()
或者onDenied()
中的任何一个,也就是说AndPermission将不会有任何响应。
当showRationale()
被回调时正确的做法是显示一个Dialog征求用户意见,是否要启动设置页面授权安装未知来源应用权限,根据用户选择调用RequestExecutor#execute()
或者RequestExecutor#cancel()
。
当onGranted()
被回调时说明用户同意了权限,并会立刻进入安装界面,用户点击安装系统将会自动安装目标Apk到系统中;当onDenied()
被回调时说明用户拒绝了权限,并会立刻退出安装界面。开发者可以在这两个方法被调用时做一些必要的统计。