gpt4 book ai didi

android - 如何在应用程序关闭时获取 OneSignal 推送通知?

转载 作者:搜寻专家 更新时间:2023-11-01 09:40:44 26 4
gpt4 key购买 nike

我已经在我的应用程序中实现了 Onesignal 推送通知,但是当我的应用程序关闭时我没有收到推送通知。这是我的实现代码。

LoginActivity.java

public class LoginActivity extends BaseActivity {

private static final int REQUEST_MARK_READ = 165;
private ListView userListView;
private static final String TAG = LoginActivity.class.getSimpleName();
private static ArrayList<String> userids=new ArrayList<>();
private static boolean activityStarted;

public static void start(Context context) {
Intent intent = new Intent(context, LoginActivity.class);
context.startActivity(intent);
}

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

if (activityStarted && getIntent() != null && (getIntent().getFlags() & Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) != 0)
{
finish();
return;
}
activityStarted = true;
setContentView(R.layout.activity_login);
if (SharedPreferencesUtil.hasQbUser()) {
try {
Onesignal();
recreateChatSession();
} catch (Exception e) {
e.printStackTrace();
}
return;
}
Onesignal();

userListView = _findViewById(R.id.list_login_users);
TextView listHeader = (TextView) LayoutInflater.from(this)
.inflate(R.layout.include_list_hint_header, userListView, false);
listHeader.setText(R.string.login_select_user_for_login);

userListView.addHeaderView(listHeader, null, false);
userListView.setOnItemClickListener(new OnUserLoginItemClickListener());
buildUsersList();
}


public void Onesignal()
{
/*5 oct 2016*/
OneSignal.idsAvailable(new OneSignal.IdsAvailableHandler() {
@Override
public void idsAvailable(String userId, String registrationId) {
registrationId= NotificationUtilities.getRegistrationId(getApplicationContext());

userids.add(userId);
String text = "OneSignal UserID:\n" + userId + "\n\n";

// try {
// OneSignal.postNotification(new JSONObject("{'contents': {'en':'"+ PrivateChatImpl.chat_message +"'}, 'include_player_ids': ['" + userId + "']}"), null);
// } catch (JSONException e) {
// e.printStackTrace();
// }

try {
OneSignal.postNotification(new JSONObject("{'contents': {'en':'" + PrivateChatImpl.chat_message.size() + "','en':'Unread Messages'}, 'include_player_ids': ['" + userId + "']}"),
new OneSignal.PostNotificationResponseHandler() {
@Override
public void onSuccess(JSONObject response) {

Log.i("OneSignalExample", "postNotification Success: " + JsonResponse());
}

@Override
public void onFailure(JSONObject response) {
Log.e("OneSignalExample", "postNotification Failure: " + JsonResponse());
}
});
} catch (JSONException e) {
e.printStackTrace();
}

if (registrationId != null)
text += "Google Registration Id:\n" + registrationId;
else
text += "Google Registration Id:\nCould not subscribe for push";

}
});


/*5 oct 2016*/
}

public String JsonResponse()
{
String jsonResponse = null;
try {

URL url = new URL("https://onesignal.com/api/v1/notifications");
HttpURLConnection con = (HttpURLConnection)url.openConnection();
con.setUseCaches(false);
con.setDoOutput(true);
con.setDoInput(true);

con.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
con.setRequestProperty("Authorization", "Basic NGEwMGZmMjItY2NkNy0xMWUzLTk5ZDUtMDAwYzI5NDBlNjJj");
con.setRequestMethod("POST");

String strJsonBody = "{"
+ "\"app_id\": \"05b29c2d-ea2a-487f-88e8-63438bd58831\","
+ "\"include_player_ids\": "+userids+","
+ "\"data\": {\"foo\": \"bar\"},"
+ "\"contents\": {\"en\": \"English Message\"}"
+ "}";


System.out.println("strJsonBody:\n" + strJsonBody);

byte[] sendBytes = strJsonBody.getBytes("UTF-8");
con.setFixedLengthStreamingMode(sendBytes.length);

OutputStream outputStream = con.getOutputStream();
outputStream.write(sendBytes);

int httpResponse = con.getResponseCode();
System.out.println("httpResponse: " + httpResponse);

if ( httpResponse >= HttpURLConnection.HTTP_OK
&& httpResponse < HttpURLConnection.HTTP_BAD_REQUEST) {
Scanner scanner = new Scanner(con.getInputStream(), "UTF-8");
jsonResponse = scanner.useDelimiter("\\A").hasNext() ? scanner.next() : "";
scanner.close();
}
else {
Scanner scanner = new Scanner(con.getErrorStream(), "UTF-8");
jsonResponse = scanner.useDelimiter("\\A").hasNext() ? scanner.next() : "";
scanner.close();
}
System.out.println("jsonResponse:\n" + jsonResponse);

} catch(Throwable t) {
t.printStackTrace();
}

return jsonResponse;
}

MyShopApplication.java

public class MyShopApplication extends Application {
private Tracker mTracker;
private static MyShopApplication INSTANCE;

final GooglePlayServicesHelper googlePlayServicesHelper = new GooglePlayServicesHelper();
@Override
public void onCreate() {
super.onCreate();
INSTANCE=this;
HttpService.getInstance().setUp(getApplicationContext());
FacebookSdk.sdkInitialize(getApplicationContext());
sharedPreferences = getSharedPreferences(AppConstants.USER_PREFERENCES, Context.MODE_PRIVATE);

// OneSignal.startInit(this).init();
// OneSignal.enableNotificationsWhenActive(true);
// OneSignal.setLogLevel(OneSignal.LOG_LEVEL.DEBUG, OneSignal.LOG_LEVEL.DEBUG);

/* 5 october 2016 */

// OneSignal.setLogLevel(OneSignal.LOG_LEVEL.DEBUG, OneSignal.LOG_LEVEL.WARN);
OneSignal.startInit(this)
.setNotificationOpenedHandler(new ExampleNotificationOpenedHandler())
.setNotificationReceivedHandler(new ExampleNotificationReceivedHandler())
.autoPromptLocation(true)
.inFocusDisplaying(OneSignal.OSInFocusDisplayOption.None)
.disableGmsMissingPrompt(true)
.init();

/*11 oct 2016*/
OneSignal.clearOneSignalNotifications();
OneSignal.syncHashedEmail(sharedPreferences.getString(AppConstants.USER_EMAIL, ""));
/*11 oct 2016*/


/*Registering for push notifications happens automatically on Android using OneSignal.
You don't need to write anything!*/

/* 5 oct 2016*/


Crashlytics crashlyticsKit = new Crashlytics.Builder()
.core(new CrashlyticsCore.Builder()/*.disabled(BuildConfig.DEBUG)*/.build())
.build();

Fabric.with(this, crashlyticsKit, new Crashlytics(), new Crashlytics());

GoogleAnalytics analytics = GoogleAnalytics.getInstance(this);
analytics.setLocalDispatchPeriod(15);//setting dispatching to 15mins, Default is 30 mins
// To enable debug logging use: adb shell setprop log.tag.GAv4 DEBUG
mTracker = analytics.newTracker(R.xml.global_tracker);
mTracker.enableAutoActivityTracking(true);


}




/* 5 october 2016 */

private class ExampleNotificationOpenedHandler implements OneSignal.NotificationOpenedHandler {
// This fires when a notification is opened by tapping on it.
@Override
public void notificationOpened(OSNotificationOpenResult result) {
OSNotificationAction.ActionType actionType = result.action.type;
JSONObject data = result.notification.payload.additionalData;
String customKey;

if (data != null) {
customKey = data.optString("customkey", null);
if (customKey != null)
Log.i("OneSignalExample", "customkey set with value: " + customKey);
}

if (actionType == OSNotificationAction.ActionType.ActionTaken)
Log.i("OneSignalExample", "Button pressed with id: " + result.action.actionID);

// The following can be used to open an Activity of your choice.

Intent intent = new Intent(getApplicationContext(),
com.baniaclothing.rang.quickblox.ui.activity.LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

// Add the following to your AndroidManifest.xml to prevent the launching of your main Activity
// if you are calling startActivity above.
/*
<application ...>
<meta-data android:name="com.onesignal.NotificationOpened.DEFAULT" android:value="DISABLE" />
</application>
*/
}
}
/* 5 october 2016 */

/* 5 october 2016 */
private class ExampleNotificationReceivedHandler implements OneSignal.NotificationReceivedHandler {
@Override
public void notificationReceived(OSNotification notification) {
JSONObject data = notification.payload.additionalData;
String customKey;

if (data != null) {
customKey = data.optString("customkey", null);
if (customKey != null)
Log.i("OneSignalExample", "customkey set with value: " + customKey);
}
}
}

/* 5 october 2016 */
}

当我点击通知时,我的 LoginActivity.java 会启动,当我打开我的应用程序时,会显示通知,但当我关闭我的应用程序时,不会显示通知。

list 文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.baniaclothing.rang" >

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- Keeps the processor from sleeping when a message is received. -->
<uses-permission android:name="android.permission.WAKE_LOCK" />


<!-- Creates a custom permission so only this app can receive its messages. -->
<permission
android:name="com.baniaclothing.rang.quickblox.permission.C2D_MESSAGE"
android:protectionLevel="signature" />

<uses-permission android:name="com.baniaclothing.rang.permission.C2D_MESSAGE" />
<!-- This app has permission to register and receive data message. -->
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />

<application
android:name=".MyShopApplication"
android:allowBackup="true"
android:icon="@mipmap/app_icon"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme" >

<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />

<meta-data
android:name="com.onesignal.BadgeCount"
android:value="DISABLE" />
<meta-data
android:name="com.onesignal.NotificationOpened.DEFAULT"
android:value="DISABLE" />

<activity
android:name=".quickblox.ui.activity.LoginActivity"
android:label="@string/login_title"
android:screenOrientation="portrait" />

<service
android:name=".NotificationExtenderExample"
android:exported="false">
<intent-filter>
<action android:name="com.onesignal.NotificationExtender" />
</intent-filter>
</service>

<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />


</application>

</manifest>

NotificationExtenderExample

public class NotificationExtenderExample extends NotificationExtenderService {

final static String GROUP_KEY_EMAILS = "group_key_emails";


@Override
protected boolean onNotificationProcessing(OSNotificationReceivedResult receivedResult) {
OverrideSettings overrideSettings = new OverrideSettings();
overrideSettings.extender = new NotificationCompat.Extender() {
@Override
public NotificationCompat.Builder extend(NotificationCompat.Builder builder) {
// Sets the background notification color to Green on Android 5.0+ devices.
return builder.setColor(new BigInteger("FF00FF00", 16).intValue())
.setGroup(GROUP_KEY_EMAILS)
.setGroupSummary(true);
}
};

OSNotificationDisplayedResult displayedResult = displayNotification(overrideSettings);
Log.d("OneSignalExample", "Notification displayed with id: " + displayedResult.androidNotificationId);

return true;
}
}

逻辑猫

  10-14 08:56:55.683 4581-4581/com.baniaclothing.rang I/REgistraationId:: dKV-blhGGI4:APA91bFpbOMERKf_IlZ3JI9P2ngOY5EXFF7kaUyuuHSL1SGsi5qLPDGDoyJPKyA1OvK5Jd_4TfHjWQJjO-SqQY5g7tTY2ThGOusbBJwH-8-IDhxsqYeUJzvfQtJl8cvW9qOhsnTnswp7
10-14 08:56:56.287 4581-6086/com.baniaclothing.rang I/System.out: strJsonBody:
10-14 08:56:56.287 4581-6086/com.baniaclothing.rang I/System.out: {"app_id": "000000000-0000-0000-0000-0000000000","include_player_ids": [ecbef570-f713-4fb0-ada2-e7b9b864344b],"data": {"foo": "bar"},"contents": {"en": "English Message"}}
10-14 08:56:56.686 4581-6086/com.baniaclothing.rang I/System.out: httpResponse: 400
10-14 08:56:56.692 4581-6086/com.baniaclothing.rang I/System.out: jsonResponse:
10-14 08:56:56.692 4581-6086/com.baniaclothing.rang I/System.out: {"status":400,"error":"There was a problem in the JSON you submitted: unexpected character at line 1, column 74 [parse.c:652]"}
10-14 08:56:56.692 4581-6086/com.baniaclothing.rang I/OneSignalExample: postNotification Success: {"status":400,"error":"There was a problem in the JSON you submitted: unexpected character at line 1, column 74 [parse.c:652]"}

注意-请忽略 java 文件中不必要的方法调用。我刚刚展示了与 OneSignal 推送通知相关的代码。为什么我的应用关闭时没有收到通知?

最佳答案

如果您通过将应用程序置于“强制停止”状态来关闭您的应用程序,则不会收到大多数事件,包括用于推送通知的 GCM/FCM 消息。可以通过以下方式将应用置于此状态。

  • 在“设置”>“应用”中,按下“强制停止”。
  • 在某些设备上长按后退按钮。
  • 使用第 3 方任务 killer ,如 Greenify。
  • 应用程序在某些华为、小米或索尼设备上因自定义 Android 调整而关闭。可以更改以下设备设置以防止出现这种情况。
    • 华为 - 转到“设置”>“ protected 应用”,检查您的应用。
    • 小米 - 确保在设置中为您的应用启用“自动启动”属性。
    • Sony - 点击电池图标。转到电源管理 > STAMINA 模式 > 处于待机状态的应用程序 > 添加您的应用程序。

要确认您的应用状态是否存在问题,请发送一些通知并检查以下 GCM logcat 条目。

W/GCM-DMM: broadcast intent callback: result=CANCELLED forIntent { act=com.google.android.c2dm.intent.RECEIVE pkg=com.onesignal.example (has extras) }

一些设备制造商会将应用列入白名单,以免进入强制关闭状态。例如 Gmail 和 Whatsapp。

参见 OneSignal's documentation了解更多详情。

关于android - 如何在应用程序关闭时获取 OneSignal 推送通知?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40025447/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com