Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检测键盘在android应用程序外部处于活动状态_Android_Accessibilityservice - Fatal编程技术网

检测键盘在android应用程序外部处于活动状态

检测键盘在android应用程序外部处于活动状态,android,accessibilityservice,Android,Accessibilityservice,我正在尝试使用辅助功能服务检测键盘是否处于活动状态(在我的应用程序之外)。为此,我尝试阅读通知“选择键盘”(启用多个键盘时)。使用以下代码 public class KeyboardWatcher extends AccessibilityService { boolean isConnected = false; @Override public void onAccessibilityEvent(AccessibilityEvent event) { if (event.getEv

我正在尝试使用辅助功能服务检测键盘是否处于活动状态(在我的应用程序之外)。为此,我尝试阅读通知“选择键盘”(启用多个键盘时)。使用以下代码

public class KeyboardWatcher extends AccessibilityService {

boolean isConnected = false;
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
    if (event.getEventType() == AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED) {
        final String packagename = String.valueOf(event.getPackageName());
        Log.d("Package", packagename);
        String msg = "";            
        List<CharSequence> s = event.getText();
        if(s.iterator().hasNext())
        {
            msg += s.iterator().next().toString();
            Log.d("MSG", msg);

        }else{
            Log.d("TYPE", event.getEventType()+"");
        }
    }else{
        Log.d("EVENT TYPE__",event.getEventType()+"");
        final String packagename = String.valueOf(event.getPackageName());
        Log.d("PNE", packagename);          
    }

}
protected void onServiceConnected() {

    if (isConnected) {
        return;
    }       
    AccessibilityServiceInfo info = new AccessibilityServiceInfo();
    info.eventTypes = AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED;
    info.feedbackType = AccessibilityServiceInfo.FEEDBACK_ALL_MASK;
    setServiceInfo(info);
    isConnected = true;
} 
}
公共类KeyboardWatcher扩展了AccessibilityService{
布尔值未连接=假;
@凌驾
AccessibilityEvent上的公共无效(AccessibilityEvent事件){
if(event.getEventType()==AccessibilityEvent.TYPE\u通知\u状态\u已更改){
最终字符串packagename=String.valueOf(event.getPackageName());
Log.d(“包”,packagename);
字符串msg=“”;
List s=event.getText();
if(s.iterator().hasNext())
{
msg+=s.iterator().next().toString();
Log.d(“MSG”,MSG);
}否则{
Log.d(“TYPE”,event.getEventType()+”);
}
}否则{
Log.d(“事件类型”,EVENT.getEventType()+”;
最终字符串packagename=String.valueOf(event.getPackageName());
Log.d(“PNE”,packagename);
}
}
ServiceConnected()上受保护的void{
如果(未连接){
返回;
}       
AccessibilityServiceInfo=新的AccessibilityServiceInfo();
info.eventTypes=AccessibilityEvent.TYPE\通知\状态\已更改;
info.feedbackType=AccessibilityServiceInfo.FEEDBACK\u ALL\u掩码;
设置服务信息(信息);
断开连接=正确;
} 
}
现在,除“键盘选择器”通知外,所有通知都由应用程序记录。如何阅读通知,这是可能的


谢谢

如果我是正确的,则无法获得该通知,系统本身会检测所有可用键盘并显示它们(如果只有一个键盘,则不会弹出)
据我所知,没有办法得到通知

package com.sat.app.notification;
import android.content.Context;
import android.service.notification.NotificationListenerService;
import android.service.notification.StatusBarNotification;
import android.util.Log;
public class NotificationService extends NotificationListenerService {
    Context context;
    @Override
    public void onCreate() {
        super.onCreate();
        context = getApplicationContext();
    }
    @Override
    public void onNotificationPosted(StatusBarNotification sbn) {
        String pack = sbn.getPackageName();
        String title =     sbn.getNotification().extras.getString("android.title");// It will be select keyboard
        }
    @Override
    public void onNotificationRemoved(StatusBarNotification sbn) {
        Log.i("com.sat","Notification Removed");

   }
}
在清单中:添加

<service android:name="com.sat.app.notification.NotificationService"
             android:label="@string/app_name"
             android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE">
    <intent-filter>
        <action android:name="android.service.notification.NotificationListenerService" />
    </intent-filter>
</service>

安装应用程序后,允许在设置中读取通知。
经过测试并在Android 5.0上运行

注意,这在6+上不再有效(至少在Android股票上),因为键盘输入现在不是通知,而是底部导航栏上的图标。