我是新來的人,我搜索了一些問題來幫助我,但我沒有明確的答案。Android鎖定應用程序
我需要製作一個應用程序來阻止手機上的其他應用程序。 我在市場上見過幾個,但我想做一個。 有什麼方法可以知道用戶何時試圖打開應用程序並提出活動? (把密碼)。
我試過用FileObserver,但只適用於文件和目錄(顯然)。 我可以讓一個偵聽器在啓動之前捕獲其他應用程序的Intent嗎?
我對我的英語表示歉意,感謝您的幫助!
我是新來的人,我搜索了一些問題來幫助我,但我沒有明確的答案。Android鎖定應用程序
我需要製作一個應用程序來阻止手機上的其他應用程序。 我在市場上見過幾個,但我想做一個。 有什麼方法可以知道用戶何時試圖打開應用程序並提出活動? (把密碼)。
我試過用FileObserver,但只適用於文件和目錄(顯然)。 我可以讓一個偵聽器在啓動之前捕獲其他應用程序的Intent嗎?
我對我的英語表示歉意,感謝您的幫助!
不,你不知道何時啓動另一個應用程序而沒有某種破解。 這是因爲應用程序啓動不播放。
你可以做的是創建一個服務運行在固定的時間間隔,比如1000毫秒,它檢查什麼是非系統應用程序。殺死該應用程序,並從服務彈出密碼輸入框。如果密碼是正確的重新推出該應用程序
下面是一些代碼示例
timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
List<RunningAppProcessInfo> appProcesses= activityManager.getRunningAppProcesses();
for (RunningAppProcessInfo appProcess : appProcesses) {
try {
if (appProcess.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
if (!lastFrontAppPkg.equals((String) appProcess.pkgList[0])) {
apkInfo = ApkInfo.getInfoFromPackageName(appProcess.pkgList[0], mContext);
if (apkInfo == null || (apkInfo.getP().applicationInfo.flags && ApplicationInfo.FLAG_SYSTEM) == 1) {
// System app continue;
} else if (((apkInfo.getP().versionName == null)) || (apkInfo.getP().requestedPermissions == null)) {
//Application that comes preloaded with the device
continue;
} else {
lastFrontAppPkg = (String) appProcess.pkgList[0];
}
//kill the app
//Here do the pupop with password to launch the lastFrontAppPkg if the pass is correct
}
}
}
} catch (Exception e) {
//e.printStackTrace();
}
}
}
}, 0, 1000);
這裏是ApkInfo.getInfoFromPackageName()
/**
* Get the ApkInfo class of the packageName requested
*
* @param pkgName
* packageName
* @return ApkInfo class of the apk requested or null if package name
* doesn't exist
* @see ApkInfo
*/
public static ApkInfo getInfoFromPackageName(String pkgName,
Context mContext) {
ApkInfo newInfo = new ApkInfo();
try {
PackageInfo p = mContext.getPackageManager().getPackageInfo(
pkgName, PackageManager.GET_PERMISSIONS);
newInfo.appname = p.applicationInfo.loadLabel(
mContext.getPackageManager()).toString();
newInfo.pname = p.packageName;
newInfo.versionName = p.versionName;
newInfo.versionCode = p.versionCode;
newInfo.icon = p.applicationInfo.loadIcon(mContext
.getPackageManager());
newInfo.setP(p);
} catch (NameNotFoundException e) {
e.printStackTrace();
return null;
}
return newInfo;
}
有辦法做到這一點。你可以知道應用程序何時啓動。 您可以使用packagemanager類獲取有關任何已安裝和正在使用的應用程序的所有信息。並使用下面的代碼就知道whwn該應用程序啓動
@Override
public void run() { Log.i("test","detector run");
try {
Process process;
process = Runtime.getRuntime().exec(ClearLogCatCommand);
process = Runtime.getRuntime().exec(LogCatCommand);
br = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
// Check if it matches the pattern
while(((line=br.readLine()) != null) && !this.isInterrupted()){
Log.d("Detector", "RUN"+line);
// Ignore launchers
if (line.contains("cat=[" + Intent.CATEGORY_HOME + "]")) continue;
Matcher m = ActivityNamePattern.matcher(line);
if (!m.find()) continue;
if (m.groupCount()<2){
// Log.d("Detector", "Unknown problem while matching logcat output. Might be SDK version?");
continue;
}
if (mListener!=null) mListener.onActivityStarting(m.group(1), m.group(2));
Log.i("Detector", "Found activity launching: " + m.group(1) + "/ " + m.group(2));
}
} catch (IOException e) {
e.printStackTrace();
}
}
它工作....檢測所有其他應用程序? – Vikky
是......是檢測設備上其他應用程序的唯一方法 –
我試圖使用此代碼,但有一些我做錯了。請你可以提供更多的代碼來使用它。謝謝。截圖:http://oi57.tinypic.com/28b8gmd.jpg –
您現在可以使用AccessibilityService,使您可以找出哪些活動是在頂部。
在AccessibilityService類:
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {
ComponentName componentName = new ComponentName(
event.getPackageName().toString(),
event.getClassName().toString()
);
ActivityInfo activityInfo = tryGetActivity(componentName);
boolean isActivity = activityInfo != null;
if (isActivity) {
Log.i("CurrentActivity", componentName.flattenToShortString());
}
}
}
您必須在您的手機設置,可以轉到設置>無障礙>服務>您的應用程序來完成轉向輔助功能上。您還需要在Manifest中添加一些權限。大量的信息可以在Android開發者網站上找到:http://developer.android.com/reference/android/accessibilityservice/AccessibilityService.html
希望這有助於!
感謝您的好主意。你能說更多關於'tryGetActivity(componentName)'方法的解釋嗎? –
每秒檢查一次的服務會在幾個小時內耗盡您的電池。製作啓動器/家庭應用程序不是更好嗎? – Erdal
你是對的!但這不是我想要的。感謝您的回答! – ngbl