2016-07-15 6 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

Ваше приложение должно быть владельцем устройства, чтобы вести себя, как вы хотите, если у вас есть корневой доступ вы можете запустить эту команду, чтобы добиться того, что

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

this статья поможет вам много.

+0

У меня нет доступа root на моем устройстве, это главная проблема) –

+0

вы не хотите root или вы не знаете, как root? –

+1

Я знаю, как корневое устройство. Но в моей ситуации я не могу использовать root –