2016-07-15 33 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:MainActivity.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"); 
    } 
} 

<?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.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

私のデバイスにルートアクセス権がありません、それは主な問題です) –

+0

あなたはrootになりたくないですか、rootにする方法が分かりませんか? –

+1

私はデバイスをルートする方法を知っています。しかし、私の状況で私はrootを使うことはできません –

関連する問題