Cannot Resolve Method setLatestEventInfo

Android

Android Problem Overview


I am working on Notifications and I have to use setLatestEventInfo. However, Android Studio shows the following error message:

> cannot resolve method setLatestEventinfo

Here is my code snippet:

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);
}

Or if their is another way to do so, kindly suggest me that.

Android Solutions


Solution 1 - Android

Well below is a simple example of working with Notifications, go through it, hope it helps!

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

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >

    <Button
        android:id="@+id/btnShowNotification"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Show Notification" />
    
    <Button
        android:id="@+id/btnClearNotification"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Clear Notification" />

</LinearLayout>

And the activity that will be opened on click of Notification,

public class SecActivity extends Activity {

}

Solution 2 - Android

According to : https://developer.android.com/sdk/api_diff/23/changes/android.app.Notification.html

This method was removed in M (api 23). So if your compile SDK version is set to api 23+ you'll see this issue.

Solution 3 - Android

You write you have to use setLatestEventInfo. Does it mean you are ready to have your app not compatible with more recent Android versions? I strongly suggest you to use the support library v4 that contains the NotificationCompat class for app using API 4 and over.

If you really do not want to use the support library (even with Proguard optimization, using NotificationCompat will add a good 100Ko on the final app), an other way is to use reflection. If you deploy your app on an Android version that still has the deprecated setLatestEventInfo, first of all you should check if you are in such an environment, and then you use reflection to access the method.

This way, Android Studio or the compiler will not complain, since the method is accessed at runtime, and not at compile time. For instance :

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();
}

Solution 4 - Android

Go to project -> properties and set android-target 21

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionPandaView Question on Stackoverflow
Solution 1 - AndroidRohit JagtapView Answer on Stackoverflow
Solution 2 - AndroidZikkouaView Answer on Stackoverflow
Solution 3 - AndroidVincent HiribarrenView Answer on Stackoverflow
Solution 4 - AndroidSurabhi GuptaView Answer on Stackoverflow