2016-11-25 77 views
1

我試圖設置鎖定任務包,但IsAdminActive返回false。無法啓用管理員組件

要設置設備所有者和活動管理員,我使用了adb shell中的命令dpm set-device-owner PinningTest.PinningTest/.AdminReceiverTest。這成功完成。

我的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上的聯想tab3。 –

回答

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)。

由於DeviceAdminReceiverBroadcastReceiver一個子類,使用[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(this,Java.Lang.Class.FromType(typeof(AdminReceiverTest))。SimpleName);'then'testDeviceAdmin .ClassName'是「AdminReceiverTest」。但兩者都沒有工作。 –

+1

如果我運行「SetLockTaskPackages」,我得到以下安全異常:無活動管理ComponentInfo {PinningTest.PinningTest/md590431f01ea601a54308626715acc602b.AdminReceiverTest}。 –