当前位置: 首页 > 面试题库 >

如何以编程方式为应用设置锁或大头针

汪辰阳
2023-03-14
问题内容

因此,现在我正在尝试为我的孩子们开发一个Android应用程序。我想在选定的应用程序上设置特定时间的密码或密码,以防止它们打开应用程序。例如,假设我的女儿在我工作时想在手机上玩愤怒的小鸟一段时间。当她玩愤怒的小鸟时,我将选择我的重要应用(例如消息传递,Gmail等),并在上面输入密码或密码30分钟。30分钟后,我从女儿那里得到了手机,并且由于没有时间限制,所以可以不用别针打开应用程序。

我对此进行了大量研究,但未能针对我的特殊情况找到实现。

我知道应用锁具有与我想要执行的类似的结构。我只是为锁定设置了时间限制。

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

我不打算使用ActivityManager等杀死活动/应用程序。我真的只是想在特定时间段内在选定的应用程序上使用干净的锁定屏幕。

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


问题答案:

逻辑

  • 当您要阻止应用时,您必须制作并启动一项服务,
  • 在“服务”中,您必须检查应用程序的程序包名称,以便可以决定要运行哪个应用程序以及哪个应用程序显示密码/密码活动

现在的代码示例

  • 要启动服务,请使用以下代码,

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

    }



 类似资料:
  • 问题内容: 我的问题很简单 如何以编程方式设置我的按钮layout_gravity? 我在互联网上找到了它,但它只是抛出了一个Nullpointer异常: 有什么办法吗? 问题答案: Java Kotlin 有关重力值以及如何设置重力,请检查“重力”。 基本上,您应该选择依赖于父项。可以是等等。

  • 问题内容: 这个问题类似于: jsf:在UI中绑定到inputtext的integer属性在提交时设置为零 但是我对解决方案并不完全满意。上下文是相同的:我有一个Web表单,需要一个Integer值。如果文本框为空,我希望我的Integer字段为“null”,但是EL Parser会自动将我的id字段设置为“ 0”。 我可以通过在本地Tomcat VM中设置JVM参数来解决此问题: -Dorg.a

  • 问题内容: 有没有一种方法可以通过编程而不是作为vm参数来设置最大Java堆大小? 就像是: 问题答案: 不适用于任何Hotspot JVM。只能在命令行上指定JVM堆参数,然后在JVM的生存期内对其进行固定。 使用Hotspot Java实现,“更改”应用程序堆大小的唯一方法是使用不同的命令行参数在新的JVM中重新启动它。 (我隐约记得,其他一些供应商的JVM 确实 允许在运行的JVM中更改某些

  • 问题内容: 我正在使用来自Android百分比支持包的PercentRelativeLayout。这就是我的布局。 我想以编程方式更改高度。我该如何使用或其他方式进行操作。 问题答案: 您要设置一个新的百分比值吗?如果是,则需要:

  • 问题内容: 我有一个奇怪的问题。我试图以编程方式将dataSource分配给表。 我已使用界面生成器在ViewController中为其创建了一个和IBOutlet。我创建了一个实现的类。我将表的设置为dataSource的实例。一切都会编译并正常运行,直到设置dataSource的行在运行时执行。 错误是并且定义线突出显示。 有什么想法为什么我得到这个运行时错误?我正在Swift中使用XCode

  • 在我的应用程序中,我需要锁定和解锁手机。我搜索了它,我找到了很多答案,我尝试了它们,但没有人在工作。 我需要在< code>onCreate()上解锁手机,并在完成活动时再次锁定手机。 你们知道有什么方法可以做同样的事情吗? 谢谢朋友们。 编辑: 我尝试过的一些链接是: 锁屏了怎么显示活动 Android屏幕锁定/以编程方式解锁 https://groups.google.com/forum/#!