Android安全問題 程式鎖

來源:互聯網
上載者:User

標籤:

導讀:本文介紹如何?對應用加鎖的功能,無須root許可權

 某些人有時候會有這樣一種需求,小A下載了個軟體,只是軟體中的美女過於誘惑與暴露,所以他不想讓別人知道這是個什麼軟體,起碼不想讓別人開啟瀏 覽。而這款軟體又沒有鎖,任何人都可以開啟,腫麼辦呢?如果開啟它的時候需要輸入密碼,那該多好阿!於是,程式鎖這種應用就產生了

 程式鎖不是最近才有的,很久之前android就有這種apk了

這一期我們來苛刻如何?程式加鎖功能

 首先,我們先明確一下我們要做的程式具有什麼功能

1可以選擇需要加鎖的程式

2可以設定密碼

3可以關閉程式鎖

 這裡作為示範,我們就盡量簡化代碼

我們先說最關鍵的部分

最關鍵的地方在於:當使用者開啟一個應用的時候,怎麼彈出密碼頁面?

這裡沒有什麼太好的辦法,需要掃描task中的topActivity

首先,我們先獲得啟動並執行task

mActivityManager = (ActivityManager) context.getSystemService("activity");//mActivityManager.getRunningTasks(1);//List<RunningTaskInfo>

getRunningTasks方法返回一個List,我們來看看這個List是什麼

getRunningTasks 寫道
Return a list of the tasks that are currently running, with the most recent being first and older ones after in order.…… 

返回的List是有序的,第一個是最近的,所以我們取出第一個即可,然後得到此task中的最上層的Activity

ComponentName topActivity = mActivityManager.getRunningTasks(1).get(0).topActivity;

topActivity居然是ComponentName類型,下面的事情就好辦了,獲得包名和類名

ComponentName topActivity = mActivityManager.getRunningTasks(1).get(0).topActivity;String packageName = topActivity.getPackageName();String className = topActivity.getClassName();Log.v(TAG, "packageName" + packageName);Log.v(TAG, "className" + className);if (testPackageName.equals(packageName)        && testClassName.equals(className)) {    Intent intent = new Intent();    intent.setClassName("com.example.locktest", "com.example.locktest.PasswordActivity");    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);    mContext.startActivity(intent);}

由於我沒有選擇程式這一步,所以我就固定一個應用做測試,這裡選擇的是htc的note應用

String testPackageName = "com.htc.notes";String testClassName = "com.htc.notes.collection.NotesGridViewActivity";

下面我們該想,這段代碼何時執行了

開啟一個應用程式,系統不會發送廣播,我們無法直接監聽,所以這裡我們採取定時掃描的策略

這裡只是一個簡單的實現,之後我們再討論最佳化

我們採取每秒中檢查一次task的方式,這裡使用Timer吧,用Handler也一樣可以實現

private Timer mTimer;private void startTimer() {    if (mTimer == null) {        mTimer = new Timer();        LockTask lockTask = new LockTask(this);        mTimer.schedule(lockTask, 0L, 1000L);    }}

到這裡,其實我們的關鍵代碼就已經完成了

下面貼出完整帶代碼,注意:我們只關注彈出鎖介面這部分,其他部分自行實現(比如文章末尾提到的)

Task,負責檢查task,並在適當的時候彈出密碼頁面

public class LockTask extends TimerTask {    public static final String TAG = "LockTask";    private Context mContext;    String testPackageName = "com.htc.notes";    String testClassName = "com.htc.notes.collection.NotesGridViewActivity";    private ActivityManager mActivityManager;    public LockTask(Context context) {        mContext = context;        mActivityManager = (ActivityManager) context.getSystemService("activity");    }    @Override    public void run() {        ComponentName topActivity = mActivityManager.getRunningTasks(1).get(0).topActivity;        String packageName = topActivity.getPackageName();        String className = topActivity.getClassName();        Log.v(TAG, "packageName" + packageName);        Log.v(TAG, "className" + className);        if (testPackageName.equals(packageName)                && testClassName.equals(className)) {            Intent intent = new Intent();            intent.setClassName("com.example.locktest", "com.example.locktest.PasswordActivity");            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);            mContext.startActivity(intent);        }    }}

LockService,負責執行定時任務,取消任務等

public class LockService extends Service {    private Timer mTimer;    public static final int FOREGROUND_ID = 0;    private void startTimer() {        if (mTimer == null) {            mTimer = new Timer();            LockTask lockTask = new LockTask(this);            mTimer.schedule(lockTask, 0L, 1000L);        }    }    public IBinder onBind(Intent intent) {        return null;    }    public void onCreate() {        super.onCreate();        startForeground(FOREGROUND_ID, new Notification());    }    public int onStartCommand(Intent intent, int flags, int startId) {        startTimer();        return super.onStartCommand(intent, flags, startId);    }    public void onDestroy() {        stopForeground(true);        mTimer.cancel();        mTimer.purge();        mTimer = null;        super.onDestroy();    }}

MainActivity,測試用,作為應用入口,啟動service(產品中,我們可以在receiver中啟動service)。

public class MainActivity extends Activity {    public void onCreate(Bundle savedInstanceState){        super.onCreate(savedInstanceState);        startService(new Intent(this, LockService.class));    }}

PasswordActivity,密碼頁面,很粗糙,沒有核對密碼邏輯,自行實現

記得重寫onBackPressed函數,不然按返回鍵的時候……你懂的

public class PasswordActivity extends Activity {    private static final String TAG = "PasswordActivity";    Button okButton;    EditText passwordEditText;    private boolean mFinish = false;        @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.password);        passwordEditText = (EditText) findViewById(R.id.password);         okButton = (Button) findViewById(R.id.ok);         okButton.setOnClickListener(new View.OnClickListener() {            public void onClick(View v) {                String password = passwordEditText.getText().toString();                Log.v(TAG, "password" + password);                mFinish = true;                finish();            }        });    }    public void onBackPressed(){}        public void onPause(){        super.onPause();        if(!mFinish){            finish();        }    }}

xml這裡就不貼了,記得添加許可權

<uses-permission android:name="android.permission.GET_TASKS"/>

關於程式的其他部分,這裡只做簡要說明

選擇應用對其進行加鎖部分

1列出系統中所有程式(你也可以自由發揮,比如過濾掉原始應用)

2選擇,然後存入資料庫(當然,最好也有取消功能,記得從資料庫中刪除資料)

程式鎖總開關

可以使用sharedPreference,設定一個boolean開關

 現在,當我想要開啟htc的note應用的時候,就會彈出密碼頁面當我解鎖,按home會回到案頭,長按home,點擊note,還是會彈出密碼框

因為是每秒檢查一次,所以可能會有一點點延遲,你可以設定為500毫秒,但是越頻繁,佔用資源就越多

上面的代碼我取得topActivity後檢查了其包名行和類名,所以只有當開啟指定的頁面的時候,才會彈出密碼鎖

比如我對Gallery應用加密了,但是使用者正在編輯簡訊,這時候它想發多媒體訊息,於是他通過簡訊進入到了Gallery……

對於某些使用者的某些需求來說,這是不能容忍的,這時,我們只需簡單修改下判斷邏輯即可:只檢查包名,包名一致就彈出密碼鎖,這樣就完美了

 程式鎖我就分析到這裡

最後一句

當使用程式鎖的時候,你長按home,發現程式鎖也出現在“最近的任務”中,腫麼辦……給此activity設定android:excludeFromRecents="true"即可

 

 

 

 

Android安全問題 程式鎖

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.