我正在尝试使用QR码设置方法在新的出厂重置平板电脑上安装自定义DPC。我已经创建了JSON并将其转换为QR码以进行扫描。
我能够扫描QR码,并且自定义dpc应用已成功安装。之后,将显示我的设备启动器屏幕。我期望像onEnable
,onprofileprovisioningcompleted
这样的deviceadmin接收器方法被调用。我正在尝试从onprofileprovisingcompleted
方法开始我的活动。
我想自动启动活动,而无需用户干预。我的家庭Activity和deviceadminreceiver是dpc应用程序的一部分。我无法弄清为什么不调用这些方法。
我还添加了toast语句和Notifications,但它们从未执行过。请指教。
平板电脑上的操作系统为:牛轧糖。请找到下面的代码。
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="fateh.com.my.fatehdpc">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
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=".MyDeviceAdminReceiver"
android:label="DevicePolicyAdminReceiver"
android:permission="android.permission.BIND_DEVICE_ADMIN"
android:exported="true">
<meta-data
android:name="android.app.device_admin"
android:resource="@xml/device_admin" />
<intent-filter>
<action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
<action android:name="android.app.action.PROFILE_PROVISIONING_COMPLETE"/>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<action android:name="android.app.action.PROFILE_OWNER_CHANGED"/>
<action android:name="android.app.action.DEVICE_OWNER_CHANGED"/>
</intent-filter>
</receiver>
<receiver
android:name=".BootReceiver"
android:enabled="true" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
</application>
MyDeviceAdminReceiver类文件
public class MyDeviceAdminReceiver extends DeviceAdminReceiver
{
public static final String ACTION_PASSWORD_REQUIREMENTS_CHANGED =
"com.afwsamples.testdpc.policy.PASSWORD_REQUIREMENTS_CHANGED";
void showToast(Context context, String msg) {
// Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
showNotification(context,msg);
}
public void showNotification(Context context, String message) {
// Create Notification using NotificationCompat.Builder
NotificationCompat.Builder builder = new NotificationCompat.Builder(
context)
// Set Icon
// Set Ticker Message
.setTicker(message)
// Set Title
.setContentTitle("Testing")
// Set Text
.setContentText(message)
// Add an Action Button below Notification
// Set PendingIntent into Notification
// Dismiss Notification
.setAutoCancel(false);
// Create Notification Manager
NotificationManager notificationmanager = (NotificationManager) context
.getSystemService(Context.NOTIFICATION_SERVICE);
// Build Notification with Notification Manager
notificationmanager.notify(0, builder.build());
}
@Override
public void onReceive(Context context, Intent intent) {
Log.i("Nadeem",
"MyDevicePolicyReciever Received: " + intent.getAction());
switch (intent.getAction()) {
case ACTION_PASSWORD_REQUIREMENTS_CHANGED:
case Intent.ACTION_BOOT_COMPLETED:
Toast.makeText(context,"onReceive invoked ACTION_PASSWORD_REQUIREMENTS_CHANGED ACTION_BOOT_COMPLETED", Toast.LENGTH_LONG)
.show();
break;
case DevicePolicyManager.ACTION_PROFILE_OWNER_CHANGED:
Toast.makeText(context,"onReceive invoked ACTION_PROFILE_OWNER_CHANGED", Toast.LENGTH_LONG)
.show();
break;
case DevicePolicyManager.ACTION_DEVICE_OWNER_CHANGED:
Toast.makeText(context,"onReceive invoked ACTION_DEVICE_OWNER_CHANGED", Toast.LENGTH_LONG)
.show();
break;
default:
Toast.makeText(context,"onReceive invoked ACTION_DEVICE_OWNER_CHANGED", Toast.LENGTH_LONG)
.show();
super.onReceive(context, intent);
break;
}
}
@Override
public void onEnabled(Context context, Intent intent) {
UserManager userManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
long serialNumber = userManager.getSerialNumberForUser(Binder.getCallingUserHandle());
showToast(context,"Device admin enabled in user with serial number: " + serialNumber);
}
@Override
public void onDisabled(Context context, Intent intent) {
showToast(context,"Device owner disabled");
}
@Override
public void onProfileProvisioningComplete(Context context, Intent intent) {
try
{
showToast(context,"onProfileProvisioningComplete");
Intent launch = new Intent(context, MainActivity.class);
launch.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(launch);
}
catch (Exception e)
{
Log.d("nadeem", "onProfileProvisioningComplete Error " + e);
showToast(context,"onProfileProvisioningComplete Error " + e);
}
}
public static ComponentName getComponentName(Context context) {
return new ComponentName(context.getApplicationContext(), MyDeviceAdminReceiver.class);
}
}
MainActivity:它只有一个按钮的空白活动。
答案 0 :(得分:0)
使用NFC设置时,我遇到了同样的问题。错误发生在AndroidManifest.xml的“接收器”声明中(属性已导出=“ false”)。
在“接收器”声明上,将其“导出”设置为export =“ true”。 您也将其添加到下一个操作中:“ android.app.action.DEVICE_ADMIN_ENABLED”和“ android.app.action.PROFILE_PROVISIONING_COMPLETE”
答案 1 :(得分:0)
我刚刚遇到了同样的问题,并找到了解决方案。从问题中的代码片段中,我们可以看到 onReceive
被覆盖,但 super.onReceive()
仅在有时被调用(当 switch 语句达到 default case 时)。 >
普通的BroadcastReceiver
只有an abstract onReceive
,这意味着不需要调用super
。
但是,在实现 DeviceAdmin 时,您扩展了 DeviceAdminReceiver
,它具有 an important implementation for onReceive
。
999 /**
1000 * Intercept standard device administrator broadcasts. Implementations
1001 * should not override this method; it is better to implement the
1002 * convenience callbacks for each action.
1003 */
1004 @Override
1005 public void onReceive(Context context, Intent intent) {
1006 String action = intent.getAction();
1007
1008 if (ACTION_PASSWORD_CHANGED.equals(action)) {
1009 onPasswordChanged(context, intent, intent.getParcelableExtra(Intent.EXTRA_USER));
1010 } else if (ACTION_PASSWORD_FAILED.equals(action)) {
1011 onPasswordFailed(context, intent, intent.getParcelableExtra(Intent.EXTRA_USER));
1012 } else if (ACTION_PASSWORD_SUCCEEDED.equals(action)) {
1013 onPasswordSucceeded(context, intent, intent.getParcelableExtra(Intent.EXTRA_USER));
1014 } else if (ACTION_DEVICE_ADMIN_ENABLED.equals(action)) {
1015 onEnabled(context, intent);
1016 } else if (ACTION_DEVICE_ADMIN_DISABLE_REQUESTED.equals(action)) {
1017 CharSequence res = onDisableRequested(context, intent);
1018 if (res != null) {
1019 Bundle extras = getResultExtras(true);
1020 extras.putCharSequence(EXTRA_DISABLE_WARNING, res);
1021 }
1022 } else if (ACTION_DEVICE_ADMIN_DISABLED.equals(action)) {
1023 onDisabled(context, intent);
1024 } else if (ACTION_PASSWORD_EXPIRING.equals(action)) {
1025 onPasswordExpiring(context, intent, intent.getParcelableExtra(Intent.EXTRA_USER));
1026 } else if (ACTION_PROFILE_PROVISIONING_COMPLETE.equals(action)) {
1027 onProfileProvisioningComplete(context, intent);
1028 } else if (ACTION_CHOOSE_PRIVATE_KEY_ALIAS.equals(action)) {
...
这个 onReceive
的默认实现是使所有回调工作的原因。因此,在不调用 super
的情况下覆盖它会阻止所有回调工作。
我在实现接收器时犯了类似的错误。添加对 super.onReceive()
的呼叫已为我修复。
我知道这个答案很晚了,但希望它对某人有所帮助。