Невозможно решить метод setLatestEventInfo
Я работаю над уведомлениями, и мне нужно использовать setLatestEventInfo
. Однако в Android Studio отображается следующее сообщение об ошибке:
не может разрешить метод setLatestEventinfo
Вот мой fragment кода:
- Динамический список в приложении Android
- Проверка, работает ли приложение Android в фоновом режиме
- Почему redirect stdout / stderr на android не работает?
- Какова продолжительность тоста LENGTH_LONG и LENGTH_SHORT
- Управление скоростью MediaPlayer в Android
private void createNotification(Context context, String registrationID) { NotificationManager notificationManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE); Notification notification = new Notification(R.drawable.icon,"Registration Successfull",System.currentTimeMillis()); notification.flags |= Notification.FLAG_AUTO_CANCEL; Intent intent = new Intent(context,RegistrationResultActivity.class); intent.putExtra("registration_ID",registrationID); PendingIntent pendingIntent = PendingIntent.getActivity(context,0,intent,0); notification.setLatestEventInfo(context,"Registration","Successfully Registered",pendingIntent); }
Или, если это еще один способ сделать это, любезно предложите мне это.
- Настройка настраиваемого имени ActionBar из fragmentа
- Как отправить данные из диалогового windows в fragment?
- Как поддерживать несколько версий Android в коде?
- moveCamera с ошибками CameraUpdateFactory.newLatLngBounds
- Должен ли вызов метода суперclassа быть первым утверждением?
- Как включить зависимость библиотечного модуля в проекте Android Studio?
- Получить тип сети
- Поддержка Android Repo 46.0.0 с Android Studio 2.3
Ниже приведен простой пример работы с уведомлениями, пройдите через него, надеюсь, что это поможет!
MainActivity.java
public class MainActivity extends ActionBarActivity { Button btnShow, btnClear; NotificationManager manager; Notification myNotication; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initialise(); manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); btnShow.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { //API level 11 Intent intent = new Intent("com.rj.notitfications.SECACTIVITY"); PendingIntent pendingIntent = PendingIntent.getActivity(MainActivity.this, 1, intent, 0); Notification.Builder builder = new Notification.Builder(MainActivity.this); builder.setAutoCancel(false); builder.setTicker("this is ticker text"); builder.setContentTitle("WhatsApp Notification"); builder.setContentText("You have a new message"); builder.setSmallIcon(R.drawable.ic_launcher); builder.setContentIntent(pendingIntent); builder.setOngoing(true); builder.setSubText("This is subtext..."); //API level 16 builder.setNumber(100); builder.build(); myNotication = builder.getNotification(); manager.notify(11, myNotication); /* //API level 8 Notification myNotification8 = new Notification(R.drawable.ic_launcher, "this is ticker text 8", System.currentTimeMillis()); Intent intent2 = new Intent(MainActivity.this, SecActivity.class); PendingIntent pendingIntent2 = PendingIntent.getActivity(getApplicationContext(), 2, intent2, 0); myNotification8.setLatestEventInfo(getApplicationContext(), "API level 8", "this is api 8 msg", pendingIntent2); manager.notify(11, myNotification8); */ } }); btnClear.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { manager.cancel(11); } }); } private void initialise() { btnShow = (Button) findViewById(R.id.btnShowNotification); btnClear = (Button) findViewById(R.id.btnClearNotification); } }
activity_main.xml
И активность, которая будет открыта при нажатии кнопки «Уведомление»,
public class SecActivity extends Activity { }
Согласно: https://developer.android.com/sdk/api_diff/23/changes/android.app.Notification.html
Этот метод был удален в M (api 23). Поэтому, если ваша версия SDK для компиляции установлена на api 23+, вы увидите эту проблему.
Вы пишете, вам нужно использовать setLatestEventInfo
. Означает ли это, что вы готовы к тому, чтобы ваше приложение не совместимо с более поздними версиями Android? Я настоятельно рекомендую вам использовать библиотеку поддержки v4, которая содержит class NotificationCompat
для приложения с использованием API 4 и более.
Если вы действительно не хотите использовать библиотеку поддержки (даже при оптимизации Proguard, использование NotificationCompat добавит хороший 100Ko в конечном приложении), другой способ – использовать reflection. Если вы развертываете свое приложение в версии для Android, которая по-прежнему имеет устаревший setLatestEventInfo
, прежде всего, вы должны проверить, находитесь ли вы в такой среде, а затем используете reflection для доступа к методу.
Таким образом, Android Studio или компилятор не будут жаловаться, поскольку метод доступен во время выполнения, а не во время компиляции. Например :
Notification notification = null; if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) { notification = new Notification(); notification.icon = R.mipmap.ic_launcher; try { Method deprecatedMethod = notification.getClass().getMethod("setLatestEventInfo", Context.class, CharSequence.class, CharSequence.class, PendingIntent.class); deprecatedMethod.invoke(notification, context, contentTitle, null, pendingIntent); } catch (NoSuchMethodException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { Log.w(TAG, "Method not found", e); } } else { // Use new API Notification.Builder builder = new Notification.Builder(context) .setContentIntent(pendingIntent) .setSmallIcon(R.mipmap.ic_launcher) .setContentTitle(contentTitle); notification = builder.build(); }
Перейдите в проект -> свойства и установите целевой Android-цель 21