2016-07-15 29 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 –