2017-08-07 140 views
1

我的工作我的方式通過設備管理API,並同時調用上DevicePolicyManagersetPermissionGrantState功能我解決方法的設備管理員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是通過它的方式。但是,當我分發我的應用時,這並不是我想要繼續的方式。有沒有什麼辦法可以自動執行此授權,方法是請求用戶允許我的應用程序使用/不使用root的配置文件所有權。

這裏是我的接收機

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

在您自己的應用中實現它相當複雜,您應該考慮使用Android Management API,它提供了與簡單雲API相同的功能。例如相當於setPermissionGrantState的是PermissionGrant

+0

嘿,謝謝你,雖然它抽象的API它不提供解決方法,因爲該設備仍然需要恢復出廠設置,這使得它不可行,如果我不擁有該設備,如果我需要分發它在谷歌播放 – humblerookie

+0

事實上,如果沒有出廠重置,您無法在整個設備上獲得設備所有者權限,但這是設備所有者完全控制設備的安全功能。不過,您可以在設備中創建工作資料,只需要您想要控制的應用程序,您將擁有配置文件所有者權限。 – Fred