我想我的应用程序有密码保护的卸载...(如应用程序锁)
即时通讯使用folling code它的工作原理上的的Android 2.3 而不是在安卓4.0 + 版本
清单文件
<接收器的Android版本:NAME =fyp.invisibleink.UninstallIntentReceiver>
<意图过滤器的Android版本:优先级=0>
<作用机器人:名称=android.intent.action.QUERY_PACKAGE_RESTART/>
<数据机器人:计划=包/>
&所述; /意图滤光器>
< /接收器>
卸载活动code
ublic类卸载延伸活动{
@覆盖
保护无效的onCreate(包savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.activity_uninstalling);
//监听器
按钮settingsBtn =(按钮)findViewById(R.id.btnu);
settingsBtn.setOnClickListener(新View.OnClickListener(){
@覆盖
公共无效的onClick(视图v){
最后的EditText E1 =(EditText上)findViewById(R.id.etpass);
。最后的字符串传递= e1.getText()的toString();
共享preferences cupSetting = getShared preferences(
cuppassword,Context.MODE_PRIVATE);
字符串为mypass = cupSetting.getString(通,);
如果(pass.equals(为mypass)){
Toast.makeText(getApplicationContext(),
密码正确!,Toast.LENGTH_LONG).show();
Toast.makeText(getApplicationContext(),
preSS确定卸载!,Toast.LENGTH_LONG).show();
完();
} 其他 {
Toast.makeText(getApplicationContext(),
访问被拒绝!重试,Toast.LENGTH_LONG)
。显示();
e1.setText();
}
}
});
}
UninstallReceveier
公共类UninstallIntentReceiver扩展的BroadcastReceiver {
@覆盖
公共无效的onReceive(上下文的背景下,意图意图){
// TODO自动生成方法存根
//从获取额外的包名
的String [] packageNames =意图
.getStringArrayExtra(android.intent.extra.PACKAGES);
如果(packageNames!= NULL){
对于(字符串的packageName:packageNames){
如果(的packageName!= NULL
&功放;&安培; packageName.equals(com.example.invisibleink)){
//用户已选择在管理应用程序我们的应用程序
//设置
//现在启动后台线程来监视活动
新ListenActivities(上下文)。开始();
}
}
}
}
// ///////////////////////////////
类ListenActivities继承Thread {
布尔退出= FALSE;
ActivityManager AM = NULL;
上下文的背景下= NULL;
公共ListenActivities(上下文CON){
上下文= CON;
AM =(ActivityManager)上下文
.getSystemService(Context.ACTIVITY_SERVICE);
}
@覆盖
公共无效的run(){
活套prepare()。
而(!出口){
//从当前正在运行的任务信息
名单< ActivityManager.RunningTaskInfo> taskInfo =上午
.getRunningTasks(MAX_PRIORITY);
串activityName = taskInfo.get(0).topActivity
.getClassName();
Log.d(topActivity,当前活动::+ activityName);
如果(activityName
.equals(com.android.packageinstaller.UninstallerActivity)){
//用户已在管理点击卸载按钮
//应用程序设置
意向意图=新的意图(背景下,Uninstalling.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(意向);
退出= TRUE;
//要执行为所欲为pre-卸载任务
// 这里
//显示对话或者开始另一项活动或数据库
//操作etc..etc ..
// context.startActivity(新意图(背景下,
//我的preUninstallationMsgActivity.class).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
}否则,如果(activityName
.equals(com.android.settings.ManageApplications)){
//后退按钮是pressed和用户已被收回
//管理应用程序窗口
//我们现在应该关闭活动监控
退出= TRUE;
}
}
Looper.loop();
}
}
}
Permissioms
<使用-权限的Android:名称=android.permission.GET_TASKS/>
解决方案
我不积极,所以请纠正我,如果我错了,但是这可能已被删除作为一项安全功能。恶意的应用程序可能能够被移除创建设备上进一步损害创建密码和避免该应用。就像我说的,我可能是错的,但是这是看起来合法的猜测。我注意到,由于很多恶意的东西,4+做了几件事情对安全性和第三方应用程序中立下战功的发生。
i want my app to have a password protected uninstall ... (like app lock)
im using folling code it works on Android 2.3 but not on Android 4+ versions
MANIFEST FILE
<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>
Uninstalling Activity code
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("");
}
}
});
}
UninstallReceveier
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();
}
}
}
Permissioms
<uses-permission android:name="android.permission.GET_TASKS" />
解决方案
I am not positive, so please correct me if I'm wrong but this might have been removed as a security feature. A malicious app might be able to create a password and avoid the app from being removed creating further damage on the device. Like I said, I could be wrong but this is a guess that seems legit. I noticed that 4+ did a couple things for security because of a lot of malicious stuff and exploits happening within 3rd party apps.