2016-11-25 26 views
1

ロックタスクパッケージを設定しようとしていますが、IsAdminActiveがfalseを返しています。管理者コンポーネントを有効にできません

デバイスの所有者とアクティブな管理者を設定するには、コマンドdpm set-device-owner PinningTest.PinningTest/.AdminReceiverTestをadbシェルから使用しました。これで正常に完了しました。

マイMainActivity:

protected override void OnCreate(Bundle bundle) 
    { 
     base.OnCreate(bundle); 

     DevicePolicyManager devicePolicyManager = (DevicePolicyManager)GetSystemService(Context.DevicePolicyService); 
     ComponentName testDeviceAdmin = new ComponentName(this, Java.Lang.Class.FromType(typeof(AdminReceiverTest)).Name); 

     if (devicePolicyManager.IsAdminActive(testDeviceAdmin)) 
     { 
      devicePolicyManager.SetLockTaskPackages(testDeviceAdmin, new string[] { PackageName }); 
     } 
    } 

マイAndroidManifest:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
      package="PinningTest.PinningTest" 
      android:versionCode="1" android:versionName="1.0" 
      android:installLocation="auto"> 
    <uses-sdk android:minSdkVersion="21" /> 
    <uses-permission android:name="android.permission.BIND_DEVICE_ADMIN" /> 
    <application android:label="PinningTest"> 
     <receiver android:name=".AdminReceiverTest" 
       android:label="@string/ApplicationName" 
       android:description="@string/ApplicationName" 
       android:permission="android.permission.BIND_DEVICE_ADMIN"> 
      <meta-data android:name="android.app.device_admin" android:resource="@xml/device_admin" /> 
      <intent-filter> 
       <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" /> 
      </intent-filter> 
     </receiver> 
    </application> 
</manifest> 

AdminReceiverTest.cs:

namespace PinningTest 
{ 
    class AdminReceiverTest : DeviceAdminReceiver 
    { 
    } 
} 

私はチュートリアルhereに従っていましたし、また、様々な他の人が、私を見てきました完全なXamarinの例を見つけることができませんでした。

何か助けていただければ幸いです。

多くのありがとうございます。

+0

あなたのデバイスがルートされておらず、 'dpm'コマンドの後に'/data/system/device_owner.xml'が更新されていれば、ユーザアカウントが割り当てられていない(工場出荷時の設定にリセットされている)また、異なるメーカーがASOPを変更し、特別な設定が必要な場合は、Samsung – SushiHangover

+0

'devicePolicyManager.IsDeviceOwnerApp(PackageName)'を実行するとtrueが返されますが、開こうとするとパーミッションが拒否されますファイル。 set-device-ownerを実行した後に作成されることがわかりますので、正しく設定されていると思います。 5.0のLenovoタブ3です。 –

答えて

1

は、私はもともと同じ問題があったが、私は、次の

を使用してこの作業を持っています

そして、私の問題を解決するために表示されます

.\adb.exe shell dpm set-device-owner com.afwsamples.testdpc/.DeviceAdminReceiver 

使用して、デバイスの所有者を設定するので、私はこれを手動でマニフェストに入れた名前の問題のためにダウンしていたと思います。

+0

'[MetaData(" android.app。device_admin "、Resource =" @ xml/device_admin ")]'が問題を解決しました。 –

0

名前空間の衝突を避けるために、Xamarin.Androidが生成する自動生成クラス名(Md5ベース)をマニュアルマニフェストエントリで考慮していないようです。 DeviceAdminReceiver以来

があなたのマニフェストに自動生成されたクラス名を上書きする[BroadcastReceiver]クラス属性を使用し、BroadcastReceiverのサブクラスである:

[BroadcastReceiver(Name = "com.sushihangover.deviceownerapp.adminreceiver", Enabled = true, Exported = true)] 
[IntentFilter(new[] { "android.app.action.DEVICE_ADMIN_ENABLED" })] 
public class AdminReceiverTest : DeviceAdminReceiver 
{ 
    public override void OnReceive(Context context, Intent intent) 
    { 
     base.OnReceive(context, intent); 
    } 
} 

このように、あなたのマニフェストでは、次のように自動生成されます

<receiver android:enabled="true" android:exported="true" android:name="com.sushihangover.deviceownerapp.adminreceiver"> 
    <intent-filter> 
    <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" /> 
    </intent-filter> 
</receiver> 
+0

ありがとう、私は提案された変更をテストし、それでも同じ問題を抱えていましたが、クラス名のように聞こえるかもしれません。 'testDeviceAdmin.ClassName'の上にあるコードが" md590431f01ea601a54308626715acc602b.AdminReceiverTest "であり、' testDeviceAdmin = new ComponentName(これはJava.Lang.Class.FromType(typeof(AdminReceiverTest))。SimpleName); '' 'testDeviceAdmin .ClassName'は "AdminReceiverTest"です。どちらもうまくいきません。 –

+1

「SetLockTaskPackages」を実行すると、次のセキュリティ例外が発生します。アクティブな管理者がいないComponentInfo {PinningTest.PinningTest/md590431f01ea601a54308626715acc602b.AdminReceiverTest}。 –

関連する問題