سؤال

I'm trying to build a really simple app to wipe all the user data off a ICS device.

I've tried to create the app using the source code on http://developer.android.com/guide/topics/admin/device-admin.html and http://marakana.com/s/post/1291/android_device_policy_administration_tutorial

But I'm having an issue, no matter what I do, the broadcast receiver for prompting the user to allow admin does not appear!

Heres what I got so far if anyone can help with this issue.

Manifest:

<uses-sdk android:minSdkVersion="15" />

<application android:icon="@drawable/ic_launcher"
    android:label="@string/app_name">
    <activity     android:name="com.CheckActivityService.CheckActivityServiceActivity"
        android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER"     />
        </intent-filter>
    </activity>
</application>


<receiver android:name=".mDeviceAdminReceiver"
    android:label="device_admin"     android:permission="android.permission.BIND_DEVICE_ADMIN">
    <meta-data android:name="android.app.device_admin"
        android:resource="@xml/policies" />
    <intent-filter>
        <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
    </intent-filter>
</receiver>


</manifest>

Activity:

public class CheckActivityServiceActivity extends Activity implements                          OnCheckedChangeListener{

 /** Called when the activity is first created. */

static final int ACTIVATION_REQUEST = 1; // identifies our request id
DevicePolicyManager devicePolicyManager;
ComponentName deviceAdmin;
ToggleButton toggleButton;
static final String TAG = "DevicePolicyActivity";

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    toggleButton = (ToggleButton) super
        .findViewById(R.id.toggle_device_admin);
    toggleButton.setOnCheckedChangeListener(this);

    Button btn = (Button) findViewById(R.id.wipeDataBtn);
    btn.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            wipeData();
        }
    });

    devicePolicyManager = (DevicePolicyManager)     getSystemService(Context.DEVICE_POLICY_SERVICE);
    deviceAdmin = new ComponentName(CheckActivityServiceActivity.this,      mDeviceAdminReceiver.class);
     }

/**
 * Called when the state of toggle button changes. In this case, we send an
 * intent to activate the device policy administration.
 */
public void onCheckedChanged(CompoundButton button, boolean isChecked) {
        if (isChecked) {
            // Launch the activity to have the user enable our admin.
            Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
            intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, deviceAdmin);
            intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "My Boss told me     to do this!!");
            startActivityForResult(intent, ACTIVATION_REQUEST);
        }
        Log.d(TAG, "onCheckedChanged to: " + isChecked);
}

public void wipeData(){
    devicePolicyManager.wipeData(ACTIVATION_REQUEST);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode) {
        case ACTIVATION_REQUEST:
                if (resultCode == Activity.RESULT_OK) {
                        Log.i(TAG, "Administration enabled!");
                        toggleButton.setChecked(true);
                } else {
                        Log.i(TAG, "Administration enable FAILED!");
                        toggleButton.setChecked(false);
                }
                return;
        }
        super.onActivityResult(requestCode, resultCode, data);
}
}

Reciever:

 public class mDeviceAdminReceiver extends DeviceAdminReceiver {

    static final String TAG = "DeviceAdminReceiver";

    void showToast(Context context, String msg) {
        String status = "TEST";
        Toast.makeText(context, status, Toast.LENGTH_SHORT).show();
    }

    /** Called when this application is approved to be a device administrator. */
    @Override
    public void onEnabled(Context context, Intent intent) {
            super.onEnabled(context, intent);
            Toast.makeText(context, "Admin Enabeled",
                            Toast.LENGTH_LONG).show();
            Log.d(TAG, "onEnabled");
    }

    /** Called when this application is no longer the device administrator. */
    @Override
    public void onDisabled(Context context, Intent intent) {
            super.onDisabled(context, intent);
            Toast.makeText(context, "Admin Disabled",
                            Toast.LENGTH_LONG).show();
            Log.d(TAG, "onDisabled");
    }

    @Override
    public void onPasswordChanged(Context context, Intent intent) {
            super.onPasswordChanged(context, intent);
            Log.d(TAG, "onPasswordChanged");
    }

    @Override
    public void onPasswordFailed(Context context, Intent intent) {
            super.onPasswordFailed(context, intent);
            Log.d(TAG, "onPasswordFailed");
    }

    @Override
    public void onPasswordSucceeded(Context context, Intent intent) {
            super.onPasswordSucceeded(context, intent);
            Log.d(TAG, "onPasswordSucceeded");
    }
}

If anyone can help me to get this to work, as I really can't figure out why the broadcast receiver isn't firing.

هل كانت مفيدة؟

المحلول

Figured out problem, kind of stupid of me.

needed to put the receiver in the element.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top