J'effectue la notification de l'application en utilisant le site Web OneSignal et lorsque je clique sur la notification qui s'ouvre dans le navigateur Web, pas dans l'application. Mais je souhaite ouvrir toutes les notifications sur l'application.
Remarque: Mon application fonctionne sur la vue Web.
Veuillez m'aider avec les notifications de l'application.
Mon code d'activité principale:
import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.content.pm.ActivityInfo; import android.os.Bundle; import android.os.Handler; import android.view.Window; public class MainActivity extends AppCompatActivity { MyApplication myApplication; private static int SPLASH_TIME_OUT = 3000; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.requestWindowFeature(Window.FEATURE_NO_TITLE); setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); setContentView(R.layout.activity_main); myApplication = MyApplication.getInstance(); new Handler().postDelayed(new Runnable(){ @Override public void run() { Intent homeIntent = new Intent(MainActivity.this, HomeActivity.class); startActivity(homeIntent); finish(); } },SPLASH_TIME_OUT); } } My Application Code: import android.app.Application; import com.onesignal.OneSignal; public class MyApplication extends Application { private static MyApplication mInstance; public MyApplication() { mInstance = this; } @Override public void onCreate() { super.onCreate(); mInstance = this; // OneSignal Initialization OneSignal.startInit(this) .inFocusDisplaying(OneSignal.OSInFocusDisplayOption.Notification) .unsubscribeWhenNotificationsAreDisabled(true) .init(); } public static synchronized MyApplication getInstance() { return mInstance; } }
3 Réponses :
Je suis fatigué de cette version de la bibliothèque de signaux et cela a bien fonctionné
Placez-le dans le fichier build.gradle (app)
public class MyNotificationOpenedHandler implements OneSignal.NotificationOpenedHandler, AppConstants { private Application application; public MyNotificationOpenedHandler(Application application) { this.application = application; } @Override public void notificationOpened(OSNotificationOpenResult result) { String launchUrl = result.notification.payload.launchURL; if (TextUtils.isEmpty(launchUrl)) { startAppWithLaunchScreen(); } else { startAppWithHomeScreen(launchUrl); } } private void startAppWithLaunchScreen() { Intent intent = new Intent(application, SplashScreenActivity.class).setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_NEW_TASK); application.startActivity(intent); } private void startAppWithHomeScreen(String launchURL) { Intent intent = new Intent(application, WebViewActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_NEW_TASK); intent.putExtra(ONE_SIGNAL_LAUNCH_URL, launchURL); application.startActivity(intent); }}
Maintenant, créez une classe Application comme celle-ci
<application android:name=".SampleApplication" ... ... <meta-data android:name="com.onesignal.NotificationOpened.DEFAULT" android:value="DISABLE" /> </application>
Maintenant, cette SampleApplication dans le fichier manifeste
public class SampleApplication extends Application { private static SampleApplication sInstance; private static Context context; public static SampleApplication getInstance() { return sInstance; } @Override public void onCreate() { super.onCreate(); sInstance = this; context = getApplicationContext(); MultiDex.install(context); // OneSignal Initialization OneSignal.startInit(this) .setNotificationOpenedHandler(new MyNotificationOpenedHandler(this)) .init(); } public static SampleApplication getAppContext() { return (SampleApplication) context; }}
Voici ma classe de gestionnaire de notifications
//One Signal implementation 'com.onesignal:OneSignal:[3.9.1, 3.99.99]'
qu'est-ce que vous obtenez dans logcat?
D'après ce que j'ai compris, vous vouliez gérer directement la notification de signal unique dans l'application.
Voici le code que j'ai utilisé il y a longtemps pour effectuer la même chose:
@Override public void notificationOpened(OSNotificationOpenResult result) { try { //To launch homepage if in case of no launchUrl. - IOS Limitation - cannot support http from panel. if (result.notification.payload.launchURL == null) { result.notification.payload.launchURL = ""; } if (result.notification.payload.launchURL != null) { if (result.notification.payload.launchURL.startsWith("market://")) { String marketUrl = result.notification.payload.launchURL; AndroidUtils.openMarketLinkPage(context, marketUrl); } else { //Failsafe. Supports both http:// and without it. result.notification.payload.launchURL = "http://" + DeepLinkUtils.stripUrlSchema(result.notification.payload.launchURL); if (result.notification.isAppInFocus) { Intent mainIntent = NavigationUtilsKt.getHomeIntent(AppController.getInstance()); mainIntent.putExtra(AppConstants.EXTRA_DEEPLINK_DATA, DeepLinkUtils .packDeepLinkData(NotificationUtils.NOTIFICATION, Uri.parse(result.notification.payload.launchURL), result.notification.androidNotificationId)); mainIntent .setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_NEW_TASK); AppController.getInstance().startActivity(mainIntent); } else { Intent mainIntent = new Intent(AppController.getInstance().getApplicationContext(), SplashActivity.class); mainIntent .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); mainIntent.putExtras(NotificationUtils.prepareNotificationBundle(result.notification.androidNotificationId)); mainIntent.setData(Uri.parse(result.notification.payload.launchURL)); AppController.getInstance().startActivity(mainIntent); } } } if (result.notification.payload.additionalData != null) { JSONObject campaignData = result.notification.payload.additionalData; if (campaignData.has(CAMPAIGN_URI)) { GtmUtils.gtmPushNotificationClick(GTM_SCREEN_NAME_NOTIFICATION, campaignData.getString(CAMPAIGN_URI), campaignData.has(CAMPAIGN_EVENTS) ? campaignData.getString(CAMPAIGN_EVENTS) : null); } } } catch (JSONException e) { e.printStackTrace(); } }
MyNotificationOpenedHandler qui implémente OneSignal.NotificationOpenedHandler
qui remplace la méthode ci-dessous public void notificationOpened (OSNotificationOpenResult result) {}
sera appelée lorsque l'utilisateur clique sur la notification où vous pouvez écrivez votre logique.
Voici l'exemple de logique:
try { OneSignal.startInit(this) .inFocusDisplaying(OneSignal.OSInFocusDisplayOption.Notification) .setNotificationOpenedHandler(new MyNotificationOpenedHandler()) //Handle notification Opened .setNotificationReceivedHandler(new MyNotificationReceivedHandler()) .init(); NotificationUtils .sendTag(MyNotificationOpenedHandler.APP_VERSION, BuildConfig.VERSION_NAME); OneSignal.idsAvailable(new OneSignal.IdsAvailableHandler() { @Override public void idsAvailable(String userId, String registrationId) { notificationId = userId; Log.v("notificationId", "notificationId is " + notificationId); OneSignal.setSubscription(pref.getDataBoolean(PREF_IS_NOTIFICATIONS_ENABLED, true)); } }); } catch (Exception e) { e.printStackTrace(); Crashlytics.logException(e); }
J'espère que cela vous aidera, s'il vous plaît laissez-moi savoir si vous avez des questions.
Pourriez-vous s'il vous plaît m'aider avec comment mettre ces codes et où ..?
Le premier est sous votre classe Application (la classe qui étend Application que vous auriez pu mentionner dans le manifeste xml comme android.name). Et le second est une nouvelle classe MyNotificationHandler qui implémente OneSignal.
Je ne comprends pas MyNotificationReceivedHandler () ..?
J'ai essayé d'ajouter un lien profond dans mon application et c'est du travail. Des liens profonds fonctionnent pour notification et tous types de liens. C'est la meilleure façon de le faire. P>
Veuillez poster votre code pour notification