【问题标题】:how to give dynamic android.permission.WRITE_SETTINGS permission on a board non UserInterface如何在非 UserInterface 板上授予动态 android.permission.WRITE_SETTINGS 权限
【发布时间】:2020-02-06 11:37:38
【问题描述】:

我已将应用程序安装为用户模式,但没有获得 root 权限。因此,某些 android.permissions(如写入权限)会被忽略且未设置。能够从 packages.xml 以及命令“adb shell dumpsys package”中识别

我想为我安装到设备上的应用程序设置写权限。 我可以访问 android 操作系统代码,有没有办法授予权限?通过 sepolicy 更改??

注意:设备不是 UI(用户界面)

请帮忙!!

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package=<package-name>
      xmlns:tools="http://schemas.android.com/tools"
      android:versionCode="1"
      android:versionName="1.0">

    <uses-permission android:name="android.permission.WRITE_SETTINGS"  tools:ignore="ProtectedPermissions" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:ignore="ProtectedPermissions" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

    <application android:label="@string/app_name" >
        <service android:name=<service-name>
            <intent-filter >
              ---
            </intent-filter>
        </service>
    </application>
</manifest> 

【问题讨论】:

  • 需要给/data/app/下安装的应用授予android权限
  • 我认为您需要在运行时向用户征求许可。 support.google.com/googleplay/answer/6270602?hl=en
  • 对,因为这不是平板电脑应用程序(UI),我想知道如何从操作系统代码中授予它。
  • @Knight 你找到解决方案了吗?我有一个设备所有者应用程序,但我无法在没有用户提示的情况下授予 WRITE_SETTINGS

标签: android selinux


【解决方案1】:

使用此命令adb shell pm grant you package android.permission.WRITE_SECURE_SETTINGS,只有系统应用程序和root应用程序可以写入设置,但此命令可以帮助您编写设置。

   public void setSettingsAutomaticDateTimeIfNeeded() {
    String timeZoneSettings = android.provider.Settings.Global.getString(
            this.getContentResolver(),
            android.provider.Settings.Global.AUTO_TIME_ZONE);
    Log.e(TAG, "auot update check true");
    if (timeZoneSettings.contentEquals("0")) {
        android.provider.Settings.Global.putString(
                this.getContentResolver(),
                Settings.Global.AUTO_TIME_ZONE, "1");
        Log.e(TAG, "Auto update checked make true");
    }

    String timeSettings = android.provider.Settings.Global.getString(
            this.getContentResolver(),
            android.provider.Settings.Global.AUTO_TIME);
    Log.e(TAG, "auot update check true");
    if (timeSettings.contentEquals("0")) {
        android.provider.Settings.Global.putString(
                this.getContentResolver(),
                Settings.Global.AUTO_TIME, "1");
        Log.e(TAG, "Auto update checked make true");
    }
}

并添加这个 inot 清单

 <uses-permission
    android:name="android.permission.WRITE_SETTINGS"
    tools:ignore="ProtectedPermissions" />
<uses-permission
    android:name="android.permission.WRITE_SECURE_SETTINGS"
    tools:ignore="ProtectedPermissions" />

【讨论】:

  • 我尝试了同样的方法,因为它是非 root 应用程序,我收到以下错误。不允许操作:java.lang.SecurityException:权限 android.permission.WRITE_SETTINGS 不是可更改的权限类型。是的,我正在寻找 WRITE_SETTINGS。
  • 编辑了我的描述并添加了清单文件。我正在尝试通过应用程序设置 wifi ssid 数据,这不允许我将这些设置写入其中,因为我是一个用户应用程序。存储在 /data/app 中。
  • 作为 android 文档,这些仅适用于根设备和系统应用程序..
  • 这确实有效,但您需要禁用开发人员选项中的权限检查,如此处的答案所述:stackoverflow.com/questions/52079343/…
【解决方案2】:

在有根设备上,您可以使用以下命令:

adb shell appops set foo.bar.package WRITE_SETTINGS allow

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-22
    • 1970-01-01
    相关资源
    最近更新 更多