询问密码卸载应用程序之前, [英] Ask for password before uninstalling application

查看:118
本文介绍了询问密码卸载应用程序之前,的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

所有的

首先,我已经研究了很多关于我的问题,但我无法找到一个妥善的解决办法,所以我在这里发布我的查询。希望能得到这个问题更好的解决方案:

我有一个要求,我要问密码用户用户删除我的应用程序的设置,或任何其他应用程序,如MyAppSharer之前。我已经找到了一个解决方案,我可以成功地能当用户点击卸载按钮调用我的活动。我已经申请伎俩在这里,并调用服务。在服务,我运行它运行每隔1秒在那一秒,它会检查正在运行的任务的最顶端的活动计时器。这是完全运行按预期。

现在,我的问题是,本次活动apppears上的每个应用程序的用户试图卸载。我需要的是,当用户试图卸载我的申请,我打电话,活动应该只出现了我的申请。

下面是我的code:

 公共静态最后弦乐PACKAGE_INSTALLER =com.android.packageinstaller;
公共静态最后弦乐PACKAGE_INSTALLER_UNINSTALL_ACTIVITY =com.android.packageinstaller.UninstallerActivity;


alarmTimer.scheduleAtFixedRate(新的TimerTask(){
        公共无效的run(){
            mActivityManager =(ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);;
            组件名topActivity = mActivityManager.getRunningTasks(1)获得(0).topActivity;

            最后弦乐的packageName = topActivity.getPackageName();
            字符串的className = topActivity.getClassName();

            Log.v(TAG的packageName:+的packageName);
            Log.v(TAG的className:+类名);

            如果(PACKAGE_INSTALLER.equals(的packageName)
                &功放;&安培; PACKAGE_INSTALLER_UNINSTALL_ACTIVITY.equals(类名)){

                //这里我需要申请,其中包名收到与我的包名匹配的一个条件。但我不知道如何获取所选应用程序的包名卸载
                //要取消现有的UninstallerActivity并重定向用户到家庭。
                意图homeIntent =新意图();
                homeIntent.setAction(Intent.ACTION_MAIN);
                homeIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                        | Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
                homeIntent.addCategory(Intent.CATEGORY_HOME);
                startActivity(homeIntent);

                //要打开我的活动
                    意图loginActivity =新的意图(UninstallService.this,Act_Login.class);
                    loginActivity.putExtra(Constants.KEY_IS_FROM_SERVICE,真正的);
                    loginActivity.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    startActivity(loginActivity);

            }
        }
    },0,1000);
 

解决方案

你应该尝试类似如下:

1日 - 声明你的广播recevier清单文件中,将听取QUERY_PACKAGE_RESTART:

 <接收机器人:名称=。UninstallReceiver>
          <意图过滤器的Andr​​oid版本:优先=999999>
                <作用机器人:名称=android.intent.action.QUERY_PACKAGE_RESTART/>
                <数据机器人:计划=包/>
          &所述; /意图滤光器>
     < /接收器>
 

2日 - 您UnunstallIntentReceiver Java类这样的:

 公共类UninstallReceiver扩展的BroadcastReceiver {

    @覆盖
    公共无效的onReceive(上下文的背景下,意图意图){
        //从获取额外的包名
        的String [] packageNames = intent.getStringArrayExtra(android.intent.extra.PACKAGES);

        如果(packageNames!= NULL){
            对于(字符串的packageName:packageNames){
                如果(的packageName = NULL和放大器;!&安培; packageName.equals(application_package)){
                   //这里开始你的活动,并要求用户输入密码
                }
            }
        }
    }

    }
 

和请给我一些反馈

希望有所帮助。

First of all, I have researched a lot about my issue, but I could not find a proper solution so I am posting my query here. Hope to get a better solution to the issue:

I have a requirement where I need to ask for password to the user before user deletes my app from settings or from any other application like MyAppSharer. I have found one solution where I can successfully be able to call my activity when user clicks on Uninstall button. I have applied trick here, and calling service. In service, I run timer which runs every 1 second and in that one second, it checks for top most activity of running task. This is running perfectly as per expected.

Now, my issue is, this activity apppears on each of application user tries to uninstall. I need that the activity which I call, should only appear for my application when user tries to uninstall my application.

Here is my code:

public static final String PACKAGE_INSTALLER = "com.android.packageinstaller";
public static final String PACKAGE_INSTALLER_UNINSTALL_ACTIVITY = "com.android.packageinstaller.UninstallerActivity";


alarmTimer.scheduleAtFixedRate(new TimerTask() {
        public void run() {
            mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);;
            ComponentName topActivity = mActivityManager.getRunningTasks(1).get(0).topActivity;

            final String packageName = topActivity.getPackageName();
            String className = topActivity.getClassName();

            Log.v(TAG, "packageName:" + packageName);
            Log.v(TAG, "className:" + className);

            if (PACKAGE_INSTALLER.equals(packageName)
                && PACKAGE_INSTALLER_UNINSTALL_ACTIVITY.equals(className)) {

                //Here I need to apply one condition where package name received to be matched with my package name. But I am not sure how to fetch package name of selected application for uninstalling 
                //To Cancel Existing UninstallerActivity and redirect user to home.
                Intent homeIntent = new Intent();
                homeIntent.setAction(Intent.ACTION_MAIN);
                homeIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                        | Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
                homeIntent.addCategory(Intent.CATEGORY_HOME);
                startActivity(homeIntent);

                //To open my activity
                    Intent loginActivity = new Intent(UninstallService.this, Act_Login.class);
                    loginActivity.putExtra(Constants.KEY_IS_FROM_SERVICE, true);
                    loginActivity.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    startActivity(loginActivity); 

            }
        }
    }, 0, 1000);

解决方案

you should try something like the following :

1st - declare your broadcast recevier in the Manifest file , that will listen to QUERY_PACKAGE_RESTART :

  <receiver android:name=".UninstallReceiver">
          <intent-filter android:priority="999999">
                <action android:name="android.intent.action.QUERY_PACKAGE_RESTART" />
                <data android:scheme="package" />
          </intent-filter>
     </receiver>

2nd - your UnunstallIntentReceiver java class like the following :

public class UninstallReceiver extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {
        // 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("application_package")){
                   // start your activity here and ask the user for the password 
                }
            }
        }
    }

    }

and please give me some feedback

Hope That Helps.

这篇关于询问密码卸载应用程序之前,的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆