para - pantalla de bloqueo animada android
Aplicaciones de bloqueo de Android (3)
Ahora puede usar un Servicio de Accesibilidad que le permite averiguar qué Actividad se encuentra en la parte superior.
En la clase 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());
}
}
}
Tendrá que activar la Accesibilidad en la configuración de su teléfono, que se puede hacer yendo a Configuración> Accesibilidad> Servicios> Su aplicación. También hay un par de permisos que tendrás que agregar en tu Manifiesto. Mucha de la información se puede encontrar en el sitio de desarrolladores de Android: http://developer.android.com/reference/android/accessibilityservice/AccessibilityService.html
¡Espero que esto ayude!
Soy nuevo aquí y he buscado preguntas para ayudarme, pero no tengo respuestas claras.
Necesito hacer una aplicación para bloquear otras aplicaciones en el teléfono. He visto varios en el mercado pero quiero hacer uno. ¿Hay alguna forma de saber cuándo un usuario intenta abrir una aplicación y presentar una actividad? (para poner la contraseña).
Lo intenté con FileObserver, pero solo funciona con archivos y directorios (obviamente). ¿Puedo hacer un oyente que capture la intención de las otras aplicaciones antes de comenzar?
¡Me disculpo por mi inglés y aprecio su ayuda!
Hay una manera de hacerlo. Puedes saber cuándo se lanza una aplicación. puede usar la clase packagemanager para obtener toda la información sobre cualquier aplicación instalada e inbuld. y use el siguiente código para saber cuándo se lanzó la aplicación
@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();
}
}
No, no puedes saber cuándo se inicia otra aplicación sin algún tipo de hack. Esto se debe a que los lanzamientos de aplicaciones no se emiten.
Lo que puede hacer es crear un servicio que se ejecute a intervalos fijos, digamos 1000 milisegundos, que verifique qué aplicación del sistema no está en la parte frontal. Matar esa aplicación y del servicio abrir un cuadro de entrada de contraseña. Si esa contraseña es correcta relanzar esa aplicación.
Aquí hay un ejemplo de código
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);
Y aquí está el 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;
}