5

セキュリティ設定「不明なソース - 不明なソースからのアプリのインストールを許可する」をプログラムで設定しようとしています。

このため、DevicePolicyManager (レベル 21) は、この設定を設定する関数 (「SetSecureSetting」) を提供します (プロファイルまたはデバイスの所有者のみが使用できます)。

Device-Owner-App (NFC プロビジョニングによって展開) で、次のコードを試しました。

public void allowNonMarketApps() {
    DevicePolicyManager devicePolicyManager = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
    ComponentName deviceAdmin = new ComponentName(this, AdminReceiver.class);
    try {
      devicePolicyManager.setSecureSetting(deviceAdmin, Settings.Secure.INSTALL_NON_MARKET_APPS, "1");
    } catch (SecurityException e) {
      Log.d(TAG, "securityException caught");
    }
}

私のアプリはデバイスの所有者ですが、常に SecurityException が発生します。

誰でもこの問題で私を助けることができますか?

前もって感謝します!!

編集 SecurityException の出力は、デバイスの所有者がこの設定を変更できないことを示しています。

java.lang.SecurityException: Permission denial: Device owners cannot update install_non_market_apps
W/System.err(27634):    at android.os.Parcel.readException(Parcel.java:1547)
W/System.err(27634):    at android.os.Parcel.readException(Parcel.java:1499)
W/System.err(27634):    at android.app.admin.IDevicePolicyManager$Stub$Proxy.setSecureSetting(IDevicePolicyManager.java:7158)
W/System.err(27634):    at android.app.admin.DevicePolicyManager.setSecureSetting(DevicePolicyManager.java:3753)

ドキュメンテーションが何か違うことを言っているので、私は混乱しています:

public void setSecureSetting (ComponentName admin, String setting, String value) 

(API レベル 21 で追加)

プロファイルまたはデバイスの所有者によって呼び出され、Settings.Secure 設定を更新します。設定の値が設定タイプに対して正しい形式であることの検証は、呼び出し元が実行する必要があります。

この方法でプロファイルまたはデバイスの所有者が更新できる設定は次のとおりです。

DEFAULT_INPUT_METHOD

INSTALL_NON_MARKET_APPS

SKIP_FIRST_USE_HINTS

4

2 に答える 2

2

API 22で変更機能INSTALL_NON_MARKET_APPSが追加されたようです。

2014 年 10 月 21 日 (API 21 のリリース後) に行われたコードベースの変更は、次の場所にあります

これにより、ユーザーが UI を持っていなくても、仕事用プロファイル MDM で不明なソースを有効にできます。不明なソースからアプリをインストールすると、パッケージ インストーラーのダイアログが表示されます。そのため、MDM が市販されていないソースからアプリを静かにインストールできるわけではありません。

この機能は、API 21 には決定的に欠けていました。

于 2015-07-31T23:18:14.630 に答える
0

ユーザーが市販されていないアプリをインストールできないようにすることも、次のように実現できます。

DevicePolicyManager devicePolicyManager = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
ComponentName deviceAdmin = new ComponentName(this, AdminReceiver.class);
try {
  devicePolicyManager.addUserRestriction(deviceAdmin,
               UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES);
} catch (SecurityException ex) {
  Log.e(TAG, ex.getMessage());
}

次の方法で制限を解除できます

DevicePolicyManager devicePolicyManager = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
ComponentName deviceAdmin = new ComponentName(this, AdminReceiver.class);
try {
  devicePolicyManager.clearUserRestriction(deviceAdmin,
               UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES);
} catch (SecurityException ex) {
  Log.e(TAG, ex.getMessage());
}

上記のコードは、Device Owner アプリの API レベル 21 (Android 5.0) 以降で機能します。

于 2016-02-21T19:51:24.490 に答える