使用 DPM 和/或 Root 访问权限在 Android 11+ 上授予 MANAGE_EXTERNAL_STORAGE 和 REQUEST_INSTALL_PACKAGES

问题描述 投票:0回答:1

我想知道,如何使用 MANAGE_EXTERNAL_STORAGE 授予访问所有文件的权限。

(我设法让它只给我媒体访问权限,使用 DPM 并将包权限设置为“授予”)

我还想知道如何设置当前包才能安装“未知来源应用程序”。 (但没有这个我也能活下去)

我希望能够完全通过编程来完成。 设备所有者权限和/或 root 是可以接受的。

我知道如何用意图来设置它,我不需要任何类型的用户输入。

提前谢谢您。

android android-permissions device-policy-manager
1个回答
0
投票

不幸的是,我不能给你“来自信誉良好的来源的答案”,也不能给你我的问题的确切答案,但这就是我解决问题的方法。

我没有实际下载 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 由您的设备管理员安装”和类似的通知。

© www.soinside.com 2019 - 2024. All rights reserved.