gpt4 book ai didi

android - Activity 启动时服务未捕获辅助功能事件

转载 作者:行者123 更新时间:2023-11-30 02:16:29 24 4
gpt4 key购买 nike

我试图让我的应用程序在用户启动 Activity 时向我的自定义 AccessibilityService 宣布一些信息。我有一个在 Activity 开始时调用 requestFocus() 的 TextView,然后我发送一个 AccessibilityEvent 让 AccessibilityService 读取 TextView 的内容描述。我已将问题隔离到一个小应用程序中。

这是主要 Activity :

package com.example.ttstest;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.accessibility.AccessibilityEvent;

public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

View v = findViewById(R.id.textView1);
v.requestFocus();
v.sendAccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT);
}
}

布局文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.ttstest.MainActivity" >

<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:focusable="true"
android:focusableInTouchMode="true"
android:contentDescription="Secondarily focused text view"
android:text="@string/hello_world" />

<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/textView2"
android:layout_marginLeft="54dp"
android:layout_marginTop="145dp"
android:layout_toRightOf="@+id/textView2"
android:contentDescription="Initially focused text view"
android:focusable="true"
android:focusableInTouchMode="true"
android:text="Initially focused text view" />

</RelativeLayout>

还有辅助功能服务:

package com.example.ttstest;

import android.accessibilityservice.AccessibilityService;
import android.speech.tts.TextToSpeech;
import android.speech.tts.TextToSpeech.OnInitListener;
import android.util.Log;
import android.view.accessibility.AccessibilityEvent;

public class TextToSpeechService extends AccessibilityService {
private static TextToSpeech textToSpeech = null;
private static boolean ttsReady = false;

@Override
protected void onServiceConnected() {
super.onServiceConnected();
Log.e("TextToSpeechService", "Got to onServiceConnected()");
textToSpeech = new TextToSpeech(this.getApplicationContext(), new OnInitListener() {
@Override
public void onInit(int status) {
if(status == TextToSpeech.SUCCESS) {
ttsReady = true;
}
}
});
}

@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
Log.e("TextToSpeechService", "Entering onAccessibilityEvent().");
Log.e("TextToSpeechService", "Event type: " + event.getEventType() + ", from class " + event.getClassName());
if(event.getContentDescription() != null) {
Log.e("TextToSpeechService", "" + event.getContentDescription());
}
if(textToSpeech != null && ttsReady == true) {
if(event.getEventType() == AccessibilityEvent.TYPE_VIEW_FOCUSED) {
CharSequence contentDescription = event.getContentDescription();
if(contentDescription != null) {
String say = contentDescription.toString();
textToSpeech.speak(say, TextToSpeech.QUEUE_FLUSH, null);
}
} else if (event.getEventType() == AccessibilityEvent.TYPE_ANNOUNCEMENT) {
CharSequence contentDescription = event.getContentDescription();
if(contentDescription != null) {
textToSpeech.speak(event.getContentDescription().toString(), TextToSpeech.QUEUE_FLUSH, null);
}
}
}
Log.e("TextToSpeechService", "Exiting onAccessibilityEvent().");
}

@Override
public void onInterrupt() {
Log.e("TextToSpeechService", "Entering onInterrupt()");
if(textToSpeech != null && ttsReady == true) {
textToSpeech.stop();
}
}
}

这已添加到我的 AndroidManifest.xml 的适当位置:

<service android:name="com.example.ttstest.TextToSpeechService"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE" >
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService" />
</intent-filter>

<meta-data android:name="android.accessibilityservice"
android:resource="@xml/accessibilityservice"/>
</service>

我的 accessibilityservice.xml 设置:

<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityEventTypes="typeAllMask"
android:notificationTimeout="100"
android:accessibilityFeedbackType="feedbackSpoken"
android:accessibilityFlags="flagDefault"
android:canRetrieveWindowContent="true"
android:packageNames="com.example.ttstest"/>

最后,问题。当我第一次启动应用程序时,TextView 从 requestFocus() 获得焦点或对 sendAccessibilityEvent() 的调用实际上都没有向 AccessibilityService 发送任何内容。如果我通过附加物理键盘在 TextView 中切换,则会收到焦点事件。。我已确保在设置中打开 AccessibilityService,并且我从我制作此示例的应用程序中得到证明,在调用 requestFocus() 和 sendAccessibilityEvent() 时启用了 AccessibilityService。这没有帮助。似乎在第一次启动 Activity 时,这些方法都没有向 AccessibilityService 发送任何内容。我也试过调用 announceForAccessibility() 得到类似的结果。

我做错了吗?我该如何修复它,或者至少绕过它?具体来说,我想在 Activity 首次启动时向我的 AccessibilityService 发送一个事件。

更多信息:我尝试将 requestFocus() 和 sendAccessibilityEvent() 调用移动到 onStart() 和 onWindowFocusChanged();这些都不起作用。

最佳答案

我可能弄错了,但是在调用 onResume() 之前“UI”还没有准备好,所以也许这就是问题所在?

关于android - Activity 启动时服务未捕获辅助功能事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29261849/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com