gpt4 book ai didi

java - 如何以编程方式为应用程序设置锁定或 pin

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:59:53 27 4
gpt4 key购买 nike

所以现在我正在尝试为我年幼的 child 开发一个 Android 应用程序。我想在特定时间段内为选定的应用程序设置个人识别码或密码,以防止它们打开该应用程序。例如,假设我女儿想在我工作时在我的手机上玩愤怒的小鸟一段时间。当她玩愤怒的小鸟时,我会选择我的重要应用程序,如消息、gmail 等,并在上面输入 pin 或密码 30 分钟。 30 分钟后,我从女儿那里拿到手机,我可以不用 PIN 码打开应用程序,因为时间限制已过。

我已经对此进行了大量研究,但我一直无法找到适合我的特定案例的实现。

How do android "app lock" applications work?

我知道应用锁与我想做的事情有类似的结构。我只是为锁定设置一个时间限制。

https://play.google.com/store/apps/details?id=com.domobile.applock&hl=en

我不会使用 ActivityManager 等来终止 Activity/应用程序。我真的只想在特定的时间内在选定的应用程序上有一个干净的锁定屏幕。

我有一个 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();

已编辑:http://pastebin.com/MHGFw7PK

最佳答案

逻辑

  • 当你想屏蔽应用程序时,你必须制作并启动一项服务,
  • 在服务中,您必须检查应用程序的包名,以便您可以决定运行哪个应用程序以及显示 pin/密码 Activity 的哪个应用程序

Now 代码示例:

  • 要启动一个服务,代码如下,

    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();
    }
    }
    }

编辑:(获取 Lollipop 的顶级包名称)

A very good answer is here.

关于java - 如何以编程方式为应用程序设置锁定或 pin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25440741/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com