4

我試圖在打開選定應用程序以保護您的應用程序之前創建一個應用程序,其中存在鎖定/密碼屏幕。打開應用程序之前爲鎖定屏幕提供的服務

有一些在市場上,例如:

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

這裏是一個開放源碼的一個GitHub上。 https://github.com/twinone/AppLocker

我意識到,即使上述應用程序被殺害,或者ram被清除,或者電話被重新啓動等等,鎖定屏幕仍顯示爲選定的應用程序。

本質上,我想達到他們所做的相同的事情,但目前我沒有實現與我寫的服務類目前。我可以鎖定應用程序,但是當應用程序被殺時,我不能。我花時間學習了大量懸而未決的意圖,報警管理,廣播接收機,甚至是研究源代碼示例

https://github.com/twinone/AppLocker/blob/master/src/com/twinone/locker/lock/AppLockService.java

,但我在實現我沒有成功。

這裏是我的服務類:

package com.ibc.android.demo.appslist.app; 

import android.app.ActivityManager; 
import android.app.Service; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.content.SharedPreferences; 
import android.os.IBinder; 
import android.util.Log; 

import java.io.File; 
import java.util.ArrayList; 
import java.util.HashSet; 
import java.util.List; 
import java.util.Map; 
import java.util.Set; 
import java.util.Timer; 
import java.util.TimerTask; 
public class HeartBeat extends Service { 



    private static final String TAG = HeartBeat.class.getSimpleName(); 
    public Timer TIMER; 



    private static Set<AccessGranted> mAccessGrantedList = new HashSet<AccessGranted>(); 
    private Set<String> mLockedApps = new HashSet<String>(); 
    private long lastModified = 0; 
    private BroadcastReceiver mScreenStateReceiver; 
    private BroadcastReceiver mAccessGrantedReceiver; 
    private File mLockedAppsFile; 
    ArrayList<String> packagezList; 
    SharedPreferences sharedPrefs; 
    Map<String, ?> allEntries; 
    SharedPreferences sharedPrefsapp; 

    String prefix; 





    @Override 
    public IBinder onBind(Intent arg0) { 
     return null; 
    } 


    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 


     startService(new Intent(this, HeartBeat.class)); 












     // Log.i("LocalService", "Received start id " + startId + ": " + 
     // intent); 
     // We want this service to continue running until it is explicitly 
     // stopped, so return sticky. 
     if (TIMER == null) { 

      TIMER = new Timer(true); 
      TIMER.scheduleAtFixedRate(new LockAppsTimerTask(), 1000, 250); 

      mScreenStateReceiver = new BroadcastReceiver() { 

       private boolean screenOff; 

       @Override 
       public void onReceive(Context context, Intent intent) { 



        if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { 
         screenOff = true; 
        } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { 
         screenOff = false; 
        } 

        if (screenOff) { 
         //Log.i(TAG, "Cancel Timer"); 
         TIMER.cancel(); 
        } else { 
         // Log.i(TAG, "Restart Timer"); 
         TIMER = new Timer(true); 
         TIMER.scheduleAtFixedRate(new LockAppsTimerTask(), 1000, 250); 
        } 
       } 
      }; 

      IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON); 
      filter.addAction(Intent.ACTION_SCREEN_OFF); 
      registerReceiver(mScreenStateReceiver, filter); 

      mAccessGrantedReceiver = new BroadcastReceiver() { 

       @Override 
       public void onReceive(Context context, Intent intent) { 
        String action = intent.getAction(); 
        String packageName = intent.getStringExtra("packageName"); 
        if (action.equals(Constants.ACTION_GRANT_ACCESS) && packageName != null) { 
         AccessGranted ag = new AccessGranted(packageName); 
         mAccessGrantedList.remove(ag); 
         mAccessGrantedList.add(ag); 
        } 
       } 
      }; 

      IntentFilter filter2 = new IntentFilter(Constants.ACTION_GRANT_ACCESS); 
      registerReceiver(mAccessGrantedReceiver, filter2); 
     } 
     // this.stopSelf(); 



     //startforeground goes here 



     return START_STICKY; 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     startService(new Intent(this, HeartBeat.class)); 
    } 




    private class LockAppsTimerTask extends TimerTask { 




     @Override 
     public void run() { 


      sharedPrefs = getApplicationContext().getSharedPreferences(getApplicationContext().getPackageName(), Context.MODE_PRIVATE); 
      sharedPrefsapp = getApplicationContext().getSharedPreferences("appdb", Context.MODE_PRIVATE); 
      allEntries= null; 
      allEntries = sharedPrefsapp.getAll(); 

      //prefix = "m"; 
      packagezList= null; 


      packagezList = new ArrayList<String>(); 




      for (Map.Entry<String, ?> entry : allEntries.entrySet()) { 
        //Log.e("right key: ", entry.getKey() + "right value: " + entry.getValue().toString() ); 
        packagezList.add(entry.getKey()); 





      } 


/*  for (Map.Entry<String, ?> entry : allEntries.entrySet()) 
     { 
      //Check if the package name starts with the prefix. 
      if (entry.getKey().startsWith(prefix)) { 
       //Add JUST the package name (trim off the prefix). 
       packagezList.add(entry.getKey().substring(prefix.length())); 
      packagezList.add(entry.getKey()); 

      } 
     }*/ 

      for(Object object: packagezList){ 
       Log.e("YO!", (String) object); 
      } 








      ActivityManager activityManager = (ActivityManager) getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE); 

      try { 
       //List<RecentTaskInfo> recentTasks = activityManager.getRecentTasks(1, ActivityManager.RECENT_IGNORE_UNAVAILABLE); 
       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); 
       // Log.e(" My package name", "" + getApplicationContext().getPackageName()); 








       //for (Object data : newArrayList) { 

       for(Object object: packagezList){ 

// Provide the packagename(s) of apps here, you want to show password activity 
        if ((activityOnTop.contains((CharSequence) object)) && 
          (!activityOnTop.contains(getApplicationContext().getPackageName() 
          ))) { // you have to make this check even better 


         Intent i = new Intent(getApplicationContext(), LockScreenActivity.class); 
         i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION); 
         i.putExtra("", ""); 
         startActivity(i); 
        } 

       } 


      } catch (Exception e) { 
       // Log.e("Foreground App", e.getMessage(), e); 
      } 
     } 



    } 

} 

這裏是我的LockScreen活動類(所顯示的畫面時,所選擇的應用程序打開時):

package com.ibc.android.demo.appslist.app; 

import android.app.Activity; 
import android.app.ActivityManager; 
import android.content.Context; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.os.Bundle; 
import android.util.Log; 

import com.spicycurryman.getdisciplined10.app.R; 

import java.util.ArrayList; 
import java.util.List; 
import java.util.Map; 

public class LockScreenActivity extends Activity { 
    private static final String TAG = LockScreenActivity.class.getSimpleName(); 
    Map<String, ?> allEntries; 
    SharedPreferences sharedPrefsapp; 
    ArrayList<String> packagezList; 



    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_setup); 

    } 
    @Override 
    public void onBackPressed() { 



     // Grab a list of all running processes and their PIDs. 
     ActivityManager am = (ActivityManager) getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE); 
     List<ActivityManager.RunningAppProcessInfo> pids = am.getRunningAppProcesses(); 

     // Now loop through the list of PIDs and find Instagram's PID. 
     sharedPrefsapp = getApplicationContext().getSharedPreferences("appdb", Context.MODE_PRIVATE); 
     allEntries= null; 
     allEntries = sharedPrefsapp.getAll(); 

     //prefix = "m"; 
     packagezList= null; 


     packagezList = new ArrayList<String>(); 




     for (Map.Entry<String, ?> entry : allEntries.entrySet()) { 
      //Log.e("right key: ", entry.getKey() + "right value: " + entry.getValue().toString() ); 
      packagezList.add(entry.getKey()); 
     } 


     // Killing any process for blocked applications when the back button is pressed while the lock screen is displayed 

     for(Object object: packagezList){ 
      am.killBackgroundProcesses((String) object); 
      Log.d("Killed Background Process!: ", (String) object); 


     } 



     // Now that we've got the PID, kill the Instagram process. 


     // Now that we've got the PID, kill the Instagram process. 

     ActivityManager am1 = (ActivityManager) getApplicationContext().getSystemService(ACTIVITY_SERVICE); 


     // Display confirmation here, finish() activity. 
     Intent startMain = new Intent(Intent.ACTION_MAIN); 
     startMain.addCategory(Intent.CATEGORY_HOME); 
     startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     startActivity(startMain); 


     startService(new Intent(this, HeartBeat.class)); 


    /*  Intent iHeartBeatService = new Intent(this, HeartBeat.class); 
     PendingIntent piHeartBeatService = PendingIntent.getService(this, 0, iHeartBeatService, PendingIntent.FLAG_UPDATE_CURRENT); 
     AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
     alarmManager.cancel(piHeartBeatService); 
     alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 300000, piHeartBeatService);*/ 

     finish(); 
     super.onBackPressed(); 
    } 

} 

現在我能鎖定應用程序,但當應用程序死亡或電話重新啓動時,我不能。當所有應用程序強制停止或手機重新啓動,內存清零等時,Google Play商店中的應用程序鎖定應用程序仍可以成功地鎖定應用程序。

我該如何實現這一點?

+2

的開始重啓後寫權限的服務清單文件重啓,並註冊reciever然後廣播reciever內啓動您的服務 – nida 2015-01-16 10:12:40

+0

嘿羅希特,你得到的解決方案? – 2015-05-12 12:54:52

+0

你好,你可以分享AccessGranted類 – ask4solutions 2016-02-24 05:45:52

回答

2

我覺得你應該試試這個...

 package com.ankit.vkapplock; 

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.util.Log; 

public class StartupServiceReceiver extends BroadcastReceiver { 
@Override 
public void onReceive(Context context, Intent intent) { 

    if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)){ 

     context.startService(new Intent(context, HeartBeat.class )); 

} 

不要忘記加上在未經許可的boot_completion行動。

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> 
相關問題