所以我让我的AccessibilityService使用以下代码:
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
if (event.getEventType() == AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED) {
List<CharSequence> notificationList = event.getText();
for (int i = 0; i < notificationList.size(); i++) {
Toast.makeText(this.getApplicationContext(), notificationList.get(i), 1).show();
}
}
}
Run Code Online (Sandbox Code Playgroud)
它可以很好地读出创建通知时显示的文本(1).

唯一的问题是,我还需要在用户打开通知栏时显示的值(3).(2)对我来说并不重要,但知道如何阅读它会很好.您可能知道,所有值都可能不同.

那么,我怎么读出来(3)?我怀疑这是不可能的,但我notificationList似乎只有一个条目(至少只显示一个吐司).
非常感谢!
/ edit:我可以使用提取通知包裹
if (!(parcel instanceof Notification)) {
return;
}
final Notification notification = (Notification) parcel;
Run Code Online (Sandbox Code Playgroud)
但是,我不知道如何从/ notification或中提取通知的消息.notification.contentViewnotification.contentIntent
有任何想法吗?
/编辑:澄清这里的问题:我如何读出(3)?
我需要setVolumeControlStream通过一个播放声音的服务来呼叫STREAM_SYSTEM.显然在一个没有问题的Activity中,但是如何使用服务呢?
我的应用程序使用a NotificationListener来读取来自各种第三方应用程序的消息,例如WhatsApp.
到目前为止,如果只有一个聊天未读,我能够发送回复,代码如下.
但是,在WhatsApp的情况下,getNotification().actions当未读取两个以上的聊天时返回一个空对象,因为消息被捆绑在一起.正如您在下面的图片中看到的,如果通知被扩展,还有一个选项可以发送直接回复,因此我确信可以利用它,我认为像PushBullet这样的应用程序正在使用此方法.
我怎样才能访问该通知的RemoteInput?
public static ReplyIntentSender sendReply(StatusBarNotification statusBarNotification, String name) {
Notification.Action actions[] = statusBarNotification.getNotification().actions;
for (Notification.Action act : actions) {
if (act != null && act.getRemoteInputs() != null) {
if (act.title.toString().contains(name)) {
if (act.getRemoteInputs() != null)
return new ReplyIntentSender(act);
}
}
}
return null;
}
public static class ReplyIntentSender {
[...]
public final Notification.Action action;
public ReplyIntentSender(Notification.Action extractedAction) {
action = extractedAction;
[...]
}
private boolean sendNativeIntent(Context context, String message) {
for (android.app.RemoteInput rem …Run Code Online (Sandbox Code Playgroud) android notification-listener android-7.0-nougat remote-input
我搜索了很多,但我没有找到如何导出活动的精确答案,因此应用程序可以启动它startActivityforResult.
我如何实现这一目标?我是否必须在某些方面更改清单?
我目前正在开发一款应用程序,可在驾驶时读取短信/电子邮件.许多用户都希望得到WhatsApp/KakaoTalk的支持.
但是,由于没有"官方"方式来接收他们的消息,因此只有三个选项,都需要root:
在给定的intervall中扫描数据库的更简单方法.
另一种方法是运行具有root权限的服务并注册侦听其推送通知的接收器.这必须使用root来完成,因为两个软件包都需要基于签名的权限才能接收其推送通知.
还有另一件事我想到:安装后是否可以手动添加APK权限?在这种情况下,我可以将c2dm权限添加到我的包中.
问题是,我究竟如何运行具有root权限的服务(实际上是否可能)?我知道如何使用root运行shell命令或二进制文件,但我不知道如何以root身份启动APK的一部分.
是否可以将BroadcastReceiver集成到二进制文件中?我实际上没有使用C/C++的经验,尤其是在Android环境中.
你能帮帮我吗?谢谢.
编辑:就像我在评论中说的那样,我不想使用AccesibilityService,因为它不符合我的需要(例如,如果有多个未读消息,它会给我"2条未读消息",也不包括完整消息身体).
edit2:只是澄清事情:我知道如何用root运行命令.我需要知道的是如何注册接收特定广播"普通"接收器的广播接收器,因为广播本身需要我没有的基于签名的许可.
我有一个AccessibilityService,它将读出任何传入的通知.它在ICS及以下版本中运行良好,但已停止使用JB.
以下是清单和代码:
<service
android:name=".Services.InstantMessengerJb"
android:enabled="@bool/is_post_jb"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"
tools:ignore="ExportedService" >
<meta-data
android:name="android.accessibilityservice"
android:resource="@xml/accessibility_service_config" />
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService" />
</intent-filter>
</service>
Run Code Online (Sandbox Code Playgroud)
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
SettingsClass.logMe(tag, "New event!");
new AccessibilityProcessing(this, event);
}
@Override
protected void onServiceConnected() {
if (isInit) {
return;
}
SettingsClass.logMe(tag, "We are connected!");
AccessibilityServiceInfo info = new AccessibilityServiceInfo();
info.eventTypes = AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED;
info.feedbackType = AccessibilityServiceInfo.FEEDBACK_SPOKEN;
setServiceInfo(info);
isInit = true;
}
Run Code Online (Sandbox Code Playgroud)
如前所述,它确实适用于所有preJB设备,如魅力,但在JB上服务启动(我得到"我们已连接"),但没有一个事件被触发.
代码有什么问题吗?
我有一个PNG文件,我想用于覆盖 - 但是,这个文件必须被镜像(并旋转180°),但为了节省空间,我不想将镜像文件放在apk中,但以编程方式执行此操作.
我怎么能用Froyo及以上的方式做到这一点?
我希望在连接特定蓝牙设备时启动服务,并在断开连接时停止此服务.显然我不希望有一个后台服务,总是检查BT设备是否已连接,所以我想用接收器实现这一点.
这有可能吗?android.bluetooth.device.action.ACL_CONNECTED在这里提到,但显然它没有用.
谢谢!
我只是偶然发现了TextToSpeech.addEarcon(String, String)Android的TTS API中的方法.我实际上无法在网上找到更多信息,所以有人知道什么是耳环吗?
谢谢!
好的,我反编译了Skype的清单,以确定在通话过程中是否有任何服务或广播正在运行.来电只有几个内部广播.此外,只存在一个接收器和一个服务.
我使用我的应用程序监视所有正在运行的服务,但SkypeMainService始终在运行,即使不在通话中也是如此.
AudioModeskype 也没有改变(但根据开发人员想要的logcat-logs,但他们只是不这样做),所以我不能简单地检查它是否是MODE_IN_CALL.
如果Skype目前正在运行并且正在通话,您有什么建议吗?
谢谢!
/ edit:活动等的简要概述:
<activity android:name="com.skype.raider.Main">
<activity-alias android:name="com.skype.raider.ui.SplashScreenActivity" android:targetActivity="com.skype.raider.Main">
<receiver android:name="com.skype.MainReceiver" android:enabled="true" android:exported="false">
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.MEDIA_MOUNTED" />
<action android:name="android.intent.action.SEARCH" />
<action android:name="android.intent.action.CALL_PRIVILEGED" />
<action android:name="com.skype.raider.INCOMING_GSM_CALL" />
<action android:name="com.skype.raider.ON_GSM_CALL" />
<action android:name="com.skype.raider.intent.action.request_sync" />
</receiver>
<service android:name="com.skype.MainService">
Run Code Online (Sandbox Code Playgroud)