2017-08-07 11 views
1

ない、とDevicePolicyManagersetPermissionGrantState機能を呼び出している間、私はデバイス管理APIの周りの仕事は、私は、デバイス管理APIを介して自分の道を働いていた自身のプロファイル

Unable to start receiver com.xx.admin.receivers.AdminReceiver: java.lang.SecurityException: Admin ComponentInfo{com.xx/com.xx.admin.receivers.AdminReceiver} does not own the profile. 

を得た私は、特定の機能があることを理解デバイス/プロファイル所有者のみが実行できます。さらにNFC provisioning and dpm commandがその方法です。しかし、これは私のアプリを配布するときに進めたいことはほとんどありません。この許可を自動化する方法はありますか?ルートの有無にかかわらずプロフィールの所有権を持つアプリを許可するようにユーザーに要求することはできますか?

はここ

class AdminReceiver : DeviceAdminReceiver() { 

    var manager: DevicePolicyManager? = null 
    override fun onEnabled(context: Context?, intent: Intent?) { 
     super.onEnabled(context, intent) 
     manager = getManager(context) 
     manager!!.setPermissionGrantState(getComponentName(context!!) 
       , "com.abc.app" 
       , Manifest.permission.WRITE_EXTERNAL_STORAGE 
       , DevicePolicyManager.PERMISSION_GRANT_STATE_DENIED) 


    } 

    fun getComponentName(context: Context): ComponentName { 
     return ComponentName(context.applicationContext, AdminReceiver::class.java) 
    } 

} 

答えて

0

NFCプロビジョニングが唯一のデバイスの所有者を設定するために必要とされる私の受信機です。

私は、dpmコマンドは一般的にデバイス所有者のテスト/設定にも使用されていますが、これはプロファイル所有者を設定することもできます。

以下のコードを使用してプログラムで管理プロファイルを設定できます。管理したいアプリケーションは、このプロファイルにインストールする必要があります。このコードはandroid-AppRestrictionEnforcerに基づいていました。

/** 
* Initiates the managed profile provisioning. If we already have a managed profile set up on 
* this device, we will get an error dialog in the following provisioning phase. 
*/ 
private void provisionManagedProfile() { 
    Activity activity = getActivity(); 
    if (null == activity) { 
     return; 
    } 
    Intent intent = new Intent(ACTION_PROVISION_MANAGED_PROFILE); 
    if (Build.VERSION.SDK_INT >= 24) { 
     intent.putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME, 
       CustomDeviceAdminReceiver.getComponentName(activity)); 
    } else { 
     //noinspection deprecation 
     intent.putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME, 
       activity.getApplicationContext().getPackageName()); 
     intent.putExtra(EXTRA_DEVICE_ADMIN, CustomDeviceAdminReceiver.getComponentName(activity)); 
    } 
    if (intent.resolveActivity(activity.getPackageManager()) != null) { 
     startActivityForResult(intent, REQUEST_PROVISION_MANAGED_PROFILE); 
     activity.finish(); 
    } else { 
     Toast.makeText(activity, "Device provisioning is not enabled. Stopping.", 
       Toast.LENGTH_SHORT).show(); 
    } 
} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == REQUEST_PROVISION_MANAGED_PROFILE) { 
     if (resultCode == Activity.RESULT_OK) { 
      Toast.makeText(getActivity(), "Provisioning done.", Toast.LENGTH_SHORT).show(); 
     } else { 
      Toast.makeText(getActivity(), "Provisioning failed.", Toast.LENGTH_SHORT).show(); 
     } 
     return; 
    } 
    super.onActivityResult(requestCode, resultCode, data); 
} 
1

デバイス所有者またはプロファイル所有者アプリは、デバイスまたは仕事用プロファイルの設定時に設定する必要があります。デバイス管理者とは異なり、工場リセット(または作業プロファイルの削除)を行わずにセットアップ後に変更することはできません。アプリをデバイスの所有者またはプロフィールの所有者に設定するには、Android EMM Developers documentationをご覧ください。

自分のアプリでこれを実装するのは非常に複雑で、その代わりに、よりシンプルなクラウドAPIと同じ機能を提供するAndroid Management APIの使用を検討する必要があります。たとえば、setPermissionGrantStateに相当するのはPermissionGrantです。

+0

APIを抽象化しても、デバイスを工場出荷時のリセットにする必要がないため、デバイスを所有していない場合や、Googleに配布する必要がある場合再生 – humblerookie

+0

実際、工場出荷時のリセットなしでデバイス全体のデバイス所有者特権を得ることはできません。これは、デバイス所有者がデバイスを完全に制御できるため、セキュリティ機能です。ただし、デバイス内に仕事用プロファイルを作成することはできますが、制御するアプリケーションだけで、プロフィール所有者の権限が与えられます。 – Fred

関連する問題