desinstalación protegida por contraseña en las versiones de Android 4+ [mediante programación]

Quiero que mi aplicación tenga una desinstalación protegida por contraseña ... (como bloqueo de la aplicación)

estoy usando el código folling en el que funcionaAndroid 2.3 pero no enAndroid 4+ versiones

ARCHIVO MANIFIESTO

  <receiver android:name="fyp.invisibleink.UninstallIntentReceiver" >
        <intent-filter android:priority="0" >
            <action android:name="android.intent.action.QUERY_PACKAGE_RESTART" />

            <data android:scheme="package" />
        </intent-filter>
    </receiver>

Desinstalar el código de actividad

ublic class Uninstalling extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_uninstalling);

    // listener
    Button settingsBtn = (Button) findViewById(R.id.btnu);
    settingsBtn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            final EditText e1 = (EditText) findViewById(R.id.etpass);

            final String pass = e1.getText().toString();

            SharedPreferences cupSetting = getSharedPreferences(
                    "cuppassword", Context.MODE_PRIVATE);
            String mypass = cupSetting.getString("pass", "");

            if (pass.equals(mypass)) {
                Toast.makeText(getApplicationContext(),
                        "password is correct!", Toast.LENGTH_LONG).show();
                Toast.makeText(getApplicationContext(),
                        "press OK to uninstall!", Toast.LENGTH_LONG).show();
                finish();

            } else {
                Toast.makeText(getApplicationContext(),
                        "Access Denied! try again", Toast.LENGTH_LONG)
                        .show();
                e1.setText("");

            }
        }
    });

}

Desinstalar Receveier

public class UninstallIntentReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
    // TODO Auto-generated method stub
    // fetching package names from extras
    String[] packageNames = intent
            .getStringArrayExtra("android.intent.extra.PACKAGES");

    if (packageNames != null) {
        for (String packageName : packageNames) {
            if (packageName != null
                    && packageName.equals("com.example.invisibleink")) {
                // User has selected our application under the Manage Apps
                // settings
                // now initiating background thread to watch for activity
                new ListenActivities(context).start();

            }
        }
    }
}

// ///////////////////////////////
class ListenActivities extends Thread {
    boolean exit = false;
    ActivityManager am = null;
    Context context = null;

    public ListenActivities(Context con) {
        context = con;
        am = (ActivityManager) context
                .getSystemService(Context.ACTIVITY_SERVICE);
    }

    @Override
    public void run() {

        Looper.prepare();

        while (!exit) {

            // get the info from the currently running task
            List<ActivityManager.RunningTaskInfo> taskInfo = am
                    .getRunningTasks(MAX_PRIORITY);

            String activityName = taskInfo.get(0).topActivity
                    .getClassName();

            Log.d("topActivity", "CURRENT Activity ::" + activityName);

            if (activityName
                    .equals("com.android.packageinstaller.UninstallerActivity")) {
                // User has clicked on the Uninstall button under the Manage
                // Apps settings

                Intent intent = new Intent(context, Uninstalling.class);
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(intent);
                exit = true;
                // do whatever pre-uninstallation task you want to perform
                // here
                // show dialogue or start another activity or database
                // operations etc..etc..

                // context.startActivity(new Intent(context,
                // MyPreUninstallationMsgActivity.class).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK));

            } else if (activityName
                    .equals("com.android.settings.ManageApplications")) {
                // back button was pressed and the user has been taken back
                // to Manage Applications window
                // we should close the activity monitoring now
                exit = true;
            }
        }
        Looper.loop();
    }
}

}

Permisos

<uses-permission android:name="android.permission.GET_TASKS" />

Respuestas a la pregunta(1)

Su respuesta a la pregunta