2016-07-15 27 views
1

我想在沒有任何用戶請求的情況下激活startLockTask()。所以起初我讀了這個Device Administration 並創建小樣本應用程序。結果我在設備管理員列表中有我的應用程序,但是當我調用startLockTask()時,它仍然不以靜默模式執行。 當我試圖把它叫做這麼:startLockTask()沒有請求用戶操作

DevicePolicyManager myDevicePolicyManager = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE); 
    String[] packages = {this.getPackageName()};       
    myDevicePolicyManager.setLockTaskPackages(deviceAdminComponentName, packages); 
    startLockTask(); 

我得到一個異常:java.lang.SecurityException: Admin ComponentInfo{com.hssoft.deviceadmintest/com.hssoft.deviceadmintest.DeviceAdmin} does not own the device

所以我有設備管理員,但我不是設備所有者。我做錯了什麼,有人可以幫忙嗎? 這裏是我的全部應用程序的代碼:

清單文件:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.hssoft.deviceadmintest"> 

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
     <activity android:name=".MainActivity"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 

     <receiver 
      android:name="com.hssoft.deviceadmintest.DeviceAdmin" 
      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.PROFILE_PROVISIONING_COMPLETE"/> 
      </intent-filter> 
     </receiver> 
    </application> 
</manifest> 

XML/device_admin.xml:

<?xml version="1.0" encoding="utf-8"?> 
<device-admin> 
    <uses-policies> 
     <limit-password/> 
     <watch-login/> 
     <reset-password/> 
     <force-lock/> 
     <wipe-data/> 
     <expire-password/> 
     <encrypted-storage/> 
     <disable-camera/> 
    </uses-policies> 
</device-admin> 

DeviceAdmin.java:

package com.hssoft.deviceadmintest; 

import android.app.admin.DeviceAdminReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.util.Log; 

public class DeviceAdmin extends DeviceAdminReceiver { 

    @Override 
    public void onEnabled(Context context, Intent intent) { 
     super.onEnabled(context, intent); 
     Log.i("Device Admin: ", "Enabled"); 
    } 

    @Override 
    public String onDisableRequested(Context context, Intent intent) { 
     return "Admin disable requested"; 
    } 

    @Override 
    public void onDisabled(Context context, Intent intent) { 
     super.onDisabled(context, intent); 
     Log.i("Device Admin: ", "Disabled"); 
    } 

    @Override 
    public void onPasswordChanged(Context context, Intent intent) { 
     super.onPasswordChanged(context, intent); 
     Log.i("Device Admin: ", "Password changed"); 
    } 
} 

MainActivity.java:

package com.hssoft.deviceadmintest; 

import android.app.Activity; 
import android.app.admin.DevicePolicyManager; 
import android.content.ComponentName; 
import android.content.Context; 
import android.content.Intent; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.util.Log; 

public class MainActivity extends AppCompatActivity { 

    static final int ACTIVATION_REQUEST = 1; 
    ComponentName deviceAdminComponentName; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN); 
     deviceAdminComponentName = new ComponentName(this, DeviceAdmin.class); 
     intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, deviceAdminComponentName); 

     startActivityForResult(intent, ACTIVATION_REQUEST); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     switch (requestCode) { 
      case ACTIVATION_REQUEST: 
       if (resultCode == Activity.RESULT_OK) { 
        Log.i("MainActivity", "Administration enabled!"); 

        DevicePolicyManager myDevicePolicyManager = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE); 
        String mPackageName = this.getPackageName(); 
        if (myDevicePolicyManager.isDeviceOwnerApp(mPackageName)) { 
         myDevicePolicyManager.setLockTaskPackages(deviceAdminComponentName, new String[]{mPackageName}); 
        } 

        if (myDevicePolicyManager.isLockTaskPermitted(mPackageName)) { 
         startLockTask(); 
        } 
       } else { 
        Log.i("MainActivity", "Administration enable FAILED!"); 
       } 

       return; 
     } 

     super.onActivityResult(requestCode, resultCode, data); 
    } 
} 
+0

有人可以幫助解決這個問題嗎? –

回答

1

您的應用程序必須是設備所有者的行爲,只要你想,如果你有root權限,你可以運行這個命令來實現這一

adb shell dpm set-device-owner com.hssoft.deviceadmintest/.DeviceAdmin 

this文章將幫助你很多。

+0

我沒有在我的設備上進行root訪問,這是主要問題) –

+0

你不想root或者你不知道如何root? –

+1

我知道如何根設備。但在我的情況下,我無法使用root –