以编程方式使用辅助function服务读取通知栏标题,消息

使用辅助function服务我能够阅读通知栏标题和消息,我面临的问题是当第一次通知出现时我正在完美地阅读所有这些但是在第一次通知后,我只获得标题和文本“你有2条消息”等等,而不是整个消息。 等待你的专家意见。

代码:

@Override protected void onServiceConnected() { Log.d("AccessibilityServiceNotification", "ServiceConnected"); try { AccessibilityServiceInfo info = new AccessibilityServiceInfo(); info.eventTypes = AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED; info.feedbackType = AccessibilityServiceInfo.FEEDBACK_ALL_MASK; info.notificationTimeout = 100; setServiceInfo(info); } catch(Exception e) { Log.d("ERROR onServiceConnected", e.toString()); } } @Override public void onAccessibilityEvent(AccessibilityEvent event) { try { LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); Parcelable data = event.getParcelableData(); if(data !=null) { Notification notification = (Notification) data; RemoteViews remoteView = notification.bigContentView; ViewGroup localView = (ViewGroup) inflater.inflate(remoteView.getLayoutId(), null); remoteView.reapply(getApplicationContext(), localView); Resources resources = null; PackageManager pkm = getPackageManager(); try { resources = pkm.getResourcesForApplication("com.user.package"); } catch (NameNotFoundException e) { e.printStackTrace(); } if (resources == null) return; int TITLE = resources.getIdentifier("android:id/title", null, null); int INBOX = resources.getIdentifier("android:id/big_text", null, null); int TEXT = resources.getIdentifier("android:id/text", null, null); String packagename = String.valueOf(event.getPackageName()); title = (TextView) localView.findViewById(TITLE); inbox = (TextView) localView.findViewById(INBOX); text = (TextView) localView.findViewById(TEXT); Log.d("NOTIFICATION Package : ", packagename); Log.d("NOTIFICATION Title : ", title.getText().toString()); Log.d("NOTIFICATION You have got x messages : ", text.getText().toString()); Log.d("NOTIFICATION inbox : ", inbox.getText().toString()); } } catch(Exception e) { Log.e("onAccessibilityEvent ERROR", e.toString()); } } 

示例通知1:

package:com.whatsapp,title:你好,留言:你好吗?

示例通知2:

package:com.whatsapp,title:Hello,message:你有2条消息(而不是:你在做什么)

试试这个,下面的代码适合我 –

 Notification notification = (Notification) event.getParcelableData(); RemoteViews views = notification.contentView; Class secretClass = views.getClass(); try { Map text = new HashMap(); Field outerFields[] = secretClass.getDeclaredFields(); for (int i = 0; i < outerFields.length; i++) { if (!outerFields[i].getName().equals("mActions")) continue; outerFields[i].setAccessible(true); ArrayList actions = (ArrayList) outerFields[i] .get(views); for (Object action : actions) { Field innerFields[] = action.getClass().getDeclaredFields(); Object value = null; Integer type = null; Integer viewId = null; for (Field field : innerFields) { field.setAccessible(true); if (field.getName().equals("value")) { value = field.get(action); } else if (field.getName().equals("type")) { type = field.getInt(action); } else if (field.getName().equals("viewId")) { viewId = field.getInt(action); } } if (type == 9 || type == 10) { text.put(viewId, value.toString()); } } System.out.println("title is: " + text.get(16908310)); System.out.println("info is: " + text.get(16909082)); System.out.println("text is: " + text.get(16908358)); } } catch (Exception e) { e.printStackTrace(); } 

希望它能帮助你。

EDITED

在你的res文件夹中创建一个名为xml的文件夹 – 在其中创建一个名为“accessibilityservice”的xml并粘贴到代码下面 –

   

和内部清单将您的服务标签更新为以下代码 –

       

通过使用通知中的extras字段相当简单。 保存扩展文本行的键是EXTRA_TEXT_LINES

这对我有用:

 Notification notification = (Notification) event.getParcelableData(); CharSequence[] lines = notification.extras.getCharSequenceArray(Notification.EXTRA_TEXT_LINES); int i = 0; for(CharSequence msg : lines) { Log.d("Line " + i, (String) msg); i += 1; } 

这段代码非常适合我:

 List msgs = new ArrayList(); msgs.add("Info: " + notif.extras.getString(Notification.EXTRA_INFO_TEXT)); msgs.add("Title: " + notif.extras.getString(Notification.EXTRA_TITLE)); msgs.add("Text: " + notif.extras.getString(Notification.EXTRA_TEXT)); 

我研究了几天来获得这种方法,我已经在Android 4.4,5.5和6.0上进行了测试。 您也可以使用该方法

 if(event.getEventType() == AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED){ if(event.getPackageName().toString().equalsIgnoreCase("com.whatsapp")){ Log.d("msg", event.getText().toString().replace("[", "]").replaceAll("]", ""), Logger.EXTRA_LOG); } } 

然后你就可以得到所有书面信息。 希望能帮助到你。

                     import android.app.Notification; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.os.Bundle; import android.service.notification.NotificationListenerService; import android.service.notification.StatusBarNotification; import android.util.Log; import android.support.v4.content.LocalBroadcastManager; import java.io.ByteArrayOutputStream; 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 ticker =""; if(sbn.getNotification().tickerText !=null) { ticker = sbn.getNotification().tickerText.toString(); } Bundle extras = sbn.getNotification().extras; String title = extras.getString("android.title"); String text = extras.getCharSequence("android.text").toString(); int id1 = extras.getInt(Notification.EXTRA_SMALL_ICON); Log.i("Package",pack); Log.i("Ticker",ticker); Log.i("Title",title); Log.i("Text",text); Intent msgrcv = new Intent("Msg"); msgrcv.putExtra("package", pack); msgrcv.putExtra("ticker", ticker); msgrcv.putExtra("title", title); msgrcv.putExtra("text", text); LocalBroadcastManager.getInstance(context).sendBroadcast(msgrcv); } @Override public void onNotificationRemoved(StatusBarNotification sbn) { Log.i("Msg","Notification Removed"); } } import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView; import java.util.ArrayList; /** * Created by Deepak on 8/30/2017. */ public class CustomListAdapter extends BaseAdapter { int mResource; ArrayList arrayList; Context context; public CustomListAdapter(Context context,int resource, ArrayList arrayList) { this.context = context; this.arrayList = arrayList; this.mResource=resource; } @Override public int getCount() { return arrayList.size(); } @Override public Object getItem(int position) { return arrayList.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { Data data = (Data) getItem(position); LayoutInflater inflater =LayoutInflater.from(context); convertView=inflater.inflate(mResource,parent,false); TextView textView=(TextView)convertView.findViewById(R.id.textView); TextView textView1=(TextView)convertView.findViewById(R.id.textView2); TextView textView2=(TextView)convertView.findViewById(R.id.textView3); textView.setText(data.getName()); textView1.setText(data.getPack()); textView2.setText(data.getText()); return convertView; } } import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.support.v4.content.LocalBroadcastManager; import android.util.Log; import android.widget.ListView; import java.util.ArrayList; public class MainActivity extends Activity { ListView listView; ArrayList list; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listView=(ListView)findViewById(R.id.list) ; LocalBroadcastManager.getInstance(this).registerReceiver(onNotice, new IntentFilter("Msg")); } private BroadcastReceiver onNotice= new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String title = intent.getStringExtra("title"); String pack= intent.getStringExtra("package"); String text = intent.getStringExtra("text"); Log.d("Title",title); Data data=new Data(); data.setName(title); data.setPack(pack); data.setText(text); list=new ArrayList(); list.add(data); listView.setAdapter(new CustomListAdapter(MainActivity.this,R.layout.list_view,list)); } }; } public class Data { private String name; private String pack; private String text; public Data() { } public Data(String name, String pack, String text) { this.name = name; this.pack = pack; this.text = text; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPack() { return pack; } public void setPack(String pack) { this.pack = pack; } public String getText() { return text; } public void setText(String text) { this.text = text; } }