view.reapply из RemoteView сбоя уведомления bigContentView
Я пытаюсь создать приложение для отправки уведомлений на мои умные часы. Я нашел отличный пример приложения для уведомлений, который я модифицировал для своего тестирования, и он работает как положено. Я обнаружил, что расширенная информация, которую мне нужно отобразить, находится в RemoteViews bigContentView. Я нашел программу под названием Botification, которая может раздуть вид, который я ищу. Работает как положено в его приложении. Я пытаюсь женить его методы на моих, и мне не везет. Я также нашел какой-то источник для Notify Me!, который использует метод того же типа для извлечения удаленного просмотра уведомлений.
Это мое первое настоящее приложение для Android, и я новичок в Java. Я работаю над этим уже около месяца и узнал тонну из сообщений на этом сайте и просмотра веб-страниц. Я прошел курсы Lynda.com для Java Essentials и Android Essentials. Это также показалось мне полезным, поскольку я новичок в Java и немного изучил C++: http://chortle.ccsu.edu/java5/index.html.
Некоторые источники информации, которые я использовал: Извлечь текст уведомления из parcelable, contentView или contentIntent и http://www.kpbird.com/2013/07/android-notificationlistenerservice.html
Любая помощь будет оценена. Приложение Botification использует обработчик и другой способ обработки onPosted запросов, что заставляет меня задуматься, не является ли это моей проблемой. Любая документация или учебники, которые откормят мой мозг, будут приветствоваться.
Я включаю разделы кода, которые используют эту функцию удаленного просмотра, и, надеюсь, достаточно, чтобы понять, как я это делаю.
MainActivity.java открытый класс MainActivity расширяет Activity {
private TextView txtView;
private NotificationReceiver nReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
txtView = (TextView) findViewById(R.id.textView);
nReceiver = new NotificationReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction("com.example.snotify.NOTIFICATION_LISTENER");
registerReceiver(nReceiver,filter);
}
nlservice.java открытый класс NLService extends NotificationListenerService {
private String TAG = "NLService";
private NLServiceReceiver nlreceiver;
@Override
public void onCreate() {
super.onCreate();
nlreceiver = new NLServiceReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction("com.example.snotify.NOTIFICATION_LISTENER_SERVICE");
registerReceiver(nlreceiver,filter);
}
@Override
public void onDestroy() {
super.onDestroy();
unregisterReceiver(nlreceiver);
}
@Override
public void onNotificationPosted(StatusBarNotification sbn) {
Notification n = sbn.getNotification();
Log.i(TAG,"!!!onNotificationPosted");
Log.i(TAG,"ID :" + sbn.getId() + "Ticker:" + n.tickerText + "Pkg:" + sbn.getPackageName());
String text = NotiCrunch.extractTextFromNotification(NLService.this, n);
String description = "";
if (n.tickerText != null) {
description = n.tickerText.toString();
}
Intent i = new Intent("com.example.snotify.NOTIFICATION_LISTENER");
i.putExtra("notification_event","Notification Posted\nPackage:" + sbn.getPackageName() + "\nID:" + sbn.getId()
+ "\nText:" + text
+ "\nTag:" + sbn.getTag() + "\nTicker:" + description + "\n\n");
sendBroadcast(i);
}
noticrunch.java
открытый класс NotiCrunch {
private static String TAG = "NotiCrunch";
private static final int TIMESTAMPID = 16908388;
private static void extractViewType(ArrayList<View> outViews, Class<TextView> viewtype, View source) {
if (ViewGroup.class.isInstance(source)) {
ViewGroup vg = (ViewGroup) source;
for (int i = 0; i < vg.getChildCount(); i++) {
extractViewType(outViews, viewtype, vg.getChildAt(i));
}
} else if(viewtype.isInstance(source)) {
outViews.add(source);
}
}
public static String extractTextFromNotification(Service service, Notification notification) {
ArrayList<String> result = null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
result = extractTextFromNotification(service, notification.bigContentView);
Log.d(TAG, "It tried Big View");
Log.d(TAG, "Ticker:" + notification.tickerText);
}
if (result == null) {
result = extractTextFromNotification(service, notification.contentView);
Log.d(TAG, "It tried little view");
}
if (result == null){
Log.d(TAG, "It is returning null");
return "";
}
return TextUtils.join("\n", result);
}
private static ArrayList<String> extractTextFromNotification(Service service, RemoteViews view) {
LayoutInflater inflater = (LayoutInflater) service.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
ArrayList<String> result = new ArrayList<String>();
if (view == null) {
Log.d(TAG, "Initial view is Empty");
return null;
}
try {
ViewGroup localView = (ViewGroup) inflater.inflate(view.getLayoutId(), null);
view.reapply(service.getApplicationContext(), localView);
ArrayList<View> outViews = new ArrayList<View>();
extractViewType(outViews, TextView.class, localView);
for (View ttv: outViews) {
TextView tv = (TextView) ttv;
String txt = tv.getText().toString();
if (!TextUtils.isEmpty(txt) && tv.getId() != TIMESTAMPID) {
result.add(txt);
}
}
} catch (Exception e) {
Log.d(TAG, "FAILED to load notification! " + e.toString());
Log.wtf(TAG, e);
return null;
}
Log.d(TAG, "Return result" + result);
return result;
}
Спасибо.
1 ответ
Где происходит сбой кода? Я не вижу нигде, чтобы повторно подать заявку.