我想知道,如何使用 MANAGE_EXTERNAL_STORAGE 授予访问所有文件的权限。
(我设法让它只给我媒体访问权限,使用 DPM 并将包权限设置为“授予”)
我还想知道如何设置当前包才能安装“未知来源应用程序”。 (但没有这个我也能活下去)
我希望能够完全通过编程来完成。 设备所有者权限和/或 root 是可以接受的。
我知道如何用意图来设置它,我不需要任何类型的用户输入。
提前谢谢您。
不幸的是,我不能给你“来自信誉良好的来源的答案”,也不能给你我的问题的确切答案,但这就是我解决问题的方法。
我没有实际下载 APK 并使用文件系统,而是使用程序的资源或内存。
我最终制作了一个 ASP.NET Web 应用程序,其中列出了所有可用的 APK(类似于自定义商店)。当您看到可用的内容、设备上的版本并选择要安装的应用程序时,您就可以了提供压缩流。
类似:
InputStream is = new BufferedInputStream(httpCon.getInputStream());
ZipInputStream zipIn = new ZipInputStream(is);
然后进入安装过程,使用名为“PackageInstaller”的东西:
PackageInstaller packageInstaller = context.getPackageManager().getPackageInstaller();
PackageInstaller.SessionParams params = new PackageInstaller.SessionParams(
PackageInstaller.SessionParams.MODE_FULL_INSTALL);
params.setAppPackageName(packageName);
int sessionId = packageInstaller.createSession(params);
PackageInstaller.Session session = packageInstaller.openSession(sessionId);
OutputStream out = session.openWrite(packageName + "_session", 0, -1);
输入流转到输出流。然后是等待意图的时间:
Intent intent = new Intent(context, InstallReceiver.class);
PendingIntent pi = PendingIntent.getBroadcast(
context,
1234,
intent,
PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE
);
会话已提交并关闭。
接收者的声音是:
public class InstallReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
int status = intent.getIntExtra(PackageInstaller.EXTRA_STATUS, -1);
/*
if (status == PackageInstaller.STATUS_PENDING_USER_ACTION) {
Intent activityIntent = intent.getParcelableExtra(Intent.EXTRA_INTENT);
context.startActivity(activityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
} else
*/
if (status == PackageInstaller.STATUS_SUCCESS ) {
String packageName = intent.getStringExtra(PackageInstaller.EXTRA_PACKAGE_NAME);
Utils.showMessage("UPDATED: " + packageName);
}
}
注意“待处理的用户操作”是如何注释的吗?好吧,它被评论是因为我们拥有完全托管的设备,并且我们是设备所有者,我们可以做“不可接受的安全风险”,例如:
<uses-permission android:name="android.permission.INSTALL_PACKAGES" />
(您可以以同样的方式发送其他 APK 文件以及您自己的设备所有者 APK,并从您的所有者应用程序强制安装应用程序。)
所有这一切的主要效果是您不需要用户输入。用户收到的只是“X 由您的设备管理员安装”和类似的通知。