Java 如何以编程方式为应用设置锁或 pin
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/25440741/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to programmatically set a lock or pin for an app
提问by Rohit Tigga
So right now I am trying to develop an Android App for my young children. I want to set a pin or passwords on selected applications for a particular amount of time to prevent them from opening the app. For example, let's say that my daughter wants to play angry birds for some time on my phone while I am doing work. I will select my important apps like messaging, gmail, etc and put a pin or password on it for 30 minutes while she plays angry birds. After 30 minutes, I get my phone from my daughter and I can open the app without a pin because the time limit expired.
所以现在我正在尝试为我的孩子们开发一个 Android 应用程序。我想在特定时间内为选定的应用程序设置 PIN 码或密码,以防止它们打开应用程序。例如,假设我的女儿想在我工作时在我的手机上玩一段时间的愤怒的小鸟。当她玩愤怒的小鸟时,我会选择我的重要应用程序,例如消息传递、gmail 等,并在上面放置 30 分钟的 PIN 码或密码。30 分钟后,我从女儿那里拿到手机,我可以在没有密码的情况下打开应用程序,因为时限已过。
I have done a ton of research on this, but I haven't been able to find an implementation for my particular case.
我对此进行了大量研究,但我一直无法找到适合我的特定案例的实现。
How do android "app lock" applications work?
I know that app lock has a similar kind of structure of what I want to do. I just to place a time limit for the lock.
我知道应用锁与我想要做的有类似的结构。我只是为锁定设置一个时间限制。
https://play.google.com/store/apps/details?id=com.domobile.applock&hl=en
https://play.google.com/store/apps/details?id=com.domobile.applock&hl=en
I am staying away from killing activities/ applications with ActivityManager etc. I really just want a clean lock screen over a selected app for a particular amount of time.
我正在远离使用 ActivityManager 等杀死活动/应用程序。我真的只想在选定的应用程序上在特定时间段内有一个干净的锁定屏幕。
I have a CountdownTimer to count down the timer for a time I set. How would I modify this code to block certain applications for a chosen amount of time if I had all the packagename?
我有一个 CountdownTimer 来倒计时我设置的时间。如果我拥有所有包名,我将如何修改此代码以在选定的时间内阻止某些应用程序?
start_timer.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new AlertDialog.Builder( MainActivity.this )
.setMessage( "Are you sure you want to block the selected apps for the set amount of time?" )
.setPositiveButton( "Yeah man!", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
Log.d( "AlertDialog", "Positive" );
hourint = Integer.valueOf(number_text.getText().toString());
minuteint = Integer.valueOf(minute_text.getText().toString());
secondint = Integer.valueOf(second_text.getText().toString());
Log.i("YourActivity", "Hours: " + hourint);
Log.i("YourActivity", "Minutes: " + minuteint);
Log.i("YourActivity", "Seconds: " + secondint);
totalTimeCountInMilliseconds = ((hourint*60*60) +(minuteint*60) + (secondint)) * 1000; // time count
timeBlinkInMilliseconds = 30*1000;
countDownTimer = new CountDownTimer(totalTimeCountInMilliseconds, 500) {
// 500 means, onTick function will be called at every 500 milliseconds
@Override
public void onTick(long leftTimeInMilliseconds) {
Context context = MainActivity.this;
long seconds = leftTimeInMilliseconds / 1000;
mSeekArc.setVisibility(View.INVISIBLE);
start_timer.setVisibility(View.INVISIBLE);
block_button1.setVisibility(View.INVISIBLE);
if ( leftTimeInMilliseconds < timeBlinkInMilliseconds ) {
// textViewShowTime.setTextAppearance(getApplicationContext(), R.style.blinkText);
// change the style of the textview .. giving a red alert style
if ( blink ) {
number_text.setVisibility(View.VISIBLE);
minute_text.setVisibility(View.VISIBLE);
second_text.setVisibility(View.VISIBLE);
// if blink is true, textview will be visible
} else {
number_text.setVisibility(View.INVISIBLE);
minute_text.setVisibility(View.INVISIBLE);
second_text.setVisibility(View.INVISIBLE);
}
blink = !blink; // toggle the value of blink
}
second_text.setText(String.format("%02d", seconds % 60));
minute_text.setText(String.format("%02d", (seconds / 60) % 60));
number_text.setText(String.format("%02d", seconds / 3600)); // format the textview to show the easily readable format
}
@Override
public void onFinish() {
// this function will be called when the timecount is finished
//textViewShowTime.setText("Time up!");
number_text.setVisibility(View.VISIBLE);
minute_text.setVisibility(View.VISIBLE);
second_text.setVisibility(View.VISIBLE);
mSeekArc.setVisibility(View.VISIBLE);
start_timer.setVisibility(View.VISIBLE);
block_button1.setVisibility(View.VISIBLE);
}
}.start();
}
})
.setNegativeButton("Nope!", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
Log.d("AlertDialog", "Negative");
dialog.cancel();
}
})
.show();
EDITED: http://pastebin.com/MHGFw7PK
采纳答案by Nadeem Iqbal
Logic
逻辑
- You have to make and start a service when you want to block apps,
- And In Service you have to check packagenames of the apps, so that you can decide which app to run and which to show a pin/password activity
- 当您想阻止应用程序时,您必须创建并启动服务,
- 并且在服务中,您必须检查应用程序的包名,以便您可以决定运行哪个应用程序以及显示密码/密码活动
Now Code Example:
现在代码示例:
To Start a service, code like this,
startService(new Intent(this, SaveMyAppsService.class));
Now, Inside your service, check packages like this,
public class SaveMyAppsService extends android.app.Service { String CURRENT_PACKAGE_NAME = {your this app packagename}; String lastAppPN = ""; boolean noDelay = false; public static SaveMyAppsService instance; @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } @Override public int onStartCommand(Intent intent, int flags, int startId) { // TODO Auto-generated method stub scheduleMethod(); CURRENT_PACKAGE_NAME = getApplicationContext().getPackageName(); Log.e("Current PN", "" + CURRENT_PACKAGE_NAME); instance = this; return START_STICKY; } private void scheduleMethod() { // TODO Auto-generated method stub ScheduledExecutorService scheduler = Executors .newSingleThreadScheduledExecutor(); scheduler.scheduleAtFixedRate(new Runnable() { @Override public void run() { // TODO Auto-generated method stub // This method will check for the Running apps after every 100ms if(30 minutes spent){ stop(); }else{ checkRunningApps(); } } }, 0, 100, TimeUnit.MILLISECONDS); } public void checkRunningApps() { ActivityManager mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); List<ActivityManager.RunningTaskInfo> RunningTask = mActivityManager.getRunningTasks(1); ActivityManager.RunningTaskInfo ar = RunningTask.get(0); String activityOnTop = ar.topActivity.getPackageName(); Log.e("activity on TOp", "" + activityOnTop); // Provide the packagename(s) of apps here, you want to show password activity if (activityOnTop.contains("whatsapp") // you can make this check even better || activityOnTop.contains(CURRENT_PACKAGE_NAME)) { // Show Password Activity } else { // DO nothing } } public static void stop() { if (instance != null) { instance.stopSelf(); } } }
要启动一个服务,代码如下,
startService(new Intent(this, SaveMyAppsService.class));
现在,在您的服务中,检查这样的包裹,
public class SaveMyAppsService extends android.app.Service { String CURRENT_PACKAGE_NAME = {your this app packagename}; String lastAppPN = ""; boolean noDelay = false; public static SaveMyAppsService instance; @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } @Override public int onStartCommand(Intent intent, int flags, int startId) { // TODO Auto-generated method stub scheduleMethod(); CURRENT_PACKAGE_NAME = getApplicationContext().getPackageName(); Log.e("Current PN", "" + CURRENT_PACKAGE_NAME); instance = this; return START_STICKY; } private void scheduleMethod() { // TODO Auto-generated method stub ScheduledExecutorService scheduler = Executors .newSingleThreadScheduledExecutor(); scheduler.scheduleAtFixedRate(new Runnable() { @Override public void run() { // TODO Auto-generated method stub // This method will check for the Running apps after every 100ms if(30 minutes spent){ stop(); }else{ checkRunningApps(); } } }, 0, 100, TimeUnit.MILLISECONDS); } public void checkRunningApps() { ActivityManager mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); List<ActivityManager.RunningTaskInfo> RunningTask = mActivityManager.getRunningTasks(1); ActivityManager.RunningTaskInfo ar = RunningTask.get(0); String activityOnTop = ar.topActivity.getPackageName(); Log.e("activity on TOp", "" + activityOnTop); // Provide the packagename(s) of apps here, you want to show password activity if (activityOnTop.contains("whatsapp") // you can make this check even better || activityOnTop.contains(CURRENT_PACKAGE_NAME)) { // Show Password Activity } else { // DO nothing } } public static void stop() { if (instance != null) { instance.stopSelf(); } } }
Edit: (Get Top Package Name for Lollipop)
编辑:(获取棒棒糖的顶级包名称)
回答by Milind Soni
String lastAppPN = "";
public void checkRunningApps() {
ActivityManager mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
String activityOnTop;
if (Build.VERSION.SDK_INT > 20) {
activityOnTop = mActivityManager.getRunningAppProcesses().get(0).processName;
} else {
List<ActivityManager.RunningTaskInfo> RunningTask = mActivityManager.getRunningTasks(1);
ActivityManager.RunningTaskInfo ar = RunningTask.get(0);
activityOnTop = ar.topActivity.getPackageName();
}
//Log.e("activity on TOp", "" + activityOnTop);
// Provide the packagename(s) of apps here, you want to show password activity
if (activityOnTop.contains("whatsapp") // you can make this check even better
|| activityOnTop.contains(CURRENT_PACKAGE_NAME)) {
if (!(lastAppPN.equals(activityOnTop))) {
lastAppPN = activityOnTop;
Log.e("Whatsapp", "started");
}
} else {
if (lastAppPN.contains("whatsapp")) {
if (!(activityOnTop.equals(lastAppPN))) {
Log.e("Whatsapp", "stoped");
lastAppPN = "";
}
}
// DO nothing
}
}
回答by Vivek Barai
I have created small demo project. Hope this might be useful to someone Link to project
我创建了小型演示项目。希望这可能对某人有用 Link to project