4

これについて多くの質問があることはわかっていますが、まったく運がなかったので、ここで質問することにしました。

スプラッシュスクリーンを実行し、その後に MainActivity (単なる WebView) を実行するだけのアプリケーションがあります。プッシュ通知を受信するために、これを OneSignal と統合しました。

つまり、onesignal Web サイトから自分の電話に送信されたときに通知を受け取ります。

私のコードスニペットは以下のようになります:

スプラッシュスクリーン.java:

public class splashscreen extends Activity {
@Override
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.splash);
      Thread splashThread = new Thread() {
         @Override
         public void run() {
            try {
               int waited = 0;
               while (waited < 5000) {
                  sleep(100);
                  waited += 100;
               }
            } catch (InterruptedException e) {
               // do nothing
            } finally {
               finish();
               Intent i = new Intent();
               i.setClassName("com.google",
                              "com.google.Main");
               startActivity(i);
            }
         }
      };
      splashThread.start();
   }
   @Override
   protected void onPause() {
       super.onPause();
       OneSignal.onPaused();
   }
   @Override
   protected void onResume() {
       super.onResume();
       OneSignal.onResumed();
   }
} 

Main.java:

@SuppressLint("SetJavaScriptEnabled") public class Main extends Activity     {
    /** Called when the activity is first created. */

    WebView web;
    private static Activity currentActivity;

    Intent resultIntent = new Intent(this, ResultActivity.class);


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        currentActivity = this;

        web = (WebView) findViewById(R.id.my_webview);
        web.setWebViewClient(new myWebClient());
        web.getSettings().setJavaScriptEnabled(true);
        web.loadUrl("http://google.com");

        OneSignal.init(this, "xxxxxxx", "xxx-xxx-xxxx-xxxx-xxxxxx", new ExampleNotificationOpenedHandler());

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu){
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.main, menu);
        return true;
        }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle item selection
        switch (item.getItemId()) {
        case R.id.exit:
            finish();
            return true;
        default:
            return super.onOptionsItemSelected(item);
        }
    }

    public class myWebClient extends WebViewClient
    {
        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            // TODO Auto-generated method stub
            super.onPageStarted(view, url, favicon);
        }

        public boolean shouldOverrideUrlLoading(WebView view, String url) {

            String url2="http://google.com";
             // all links  with in ur site will be open inside the webview 
             //links that start with your domain example(http://www.example.com/)
            if (url != null && url.startsWith(url2)){
                return false;
                } 
           // all links that points outside the site will be open in a normal android browser
          else  {
                view.getContext().startActivity(
                new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
                return true;
                }
        }
    }

    // To handle "Back" key press event for WebView to go back to previous screen.
   @Override
   public boolean onKeyDown(int keyCode, KeyEvent event)
  {
    if ((keyCode == KeyEvent.KEYCODE_BACK) && web.canGoBack()) {
        web.goBack();
        return true;
    }
    return super.onKeyDown(keyCode, event);
   }

   @Override
   protected void onPause() {
       super.onPause();
       OneSignal.onPaused();
   }
   @Override
   protected void onResume() {
       super.onResume();
       OneSignal.onResumed();
   }



// NotificationOpenedHandler is implemented in its own class instead of adding implements to MainActivity so we don't hold on to a reference of our first activity if it gets recreated.
private class ExampleNotificationOpenedHandler implements NotificationOpenedHandler {
  /**
   * Callback to implement in your app to handle when a notification is opened from the Android status bar or
   * a new one comes in while the app is running.
   * This method is located in this activity as an example, you may have any class you wish implement NotificationOpenedHandler and define this method.
   *
   * @param message        The message string the user seen/should see in the Android status bar.
   * @param additionalData The additionalData key value pair section you entered in on onesignal.com.
   * @param isActive       Was the app in the foreground when the notification was received.
   */
  @Override
  public void notificationOpened(String message, JSONObject additionalData, boolean isActive) {
    String messageTitle = "OneSignal Example" + isActive, messageBody = message;


    try {
      if (additionalData != null) {
        if (additionalData.has("title"))
          messageTitle = additionalData.getString("title");
        if (additionalData.has("actionSelected"))
          messageBody += "\nPressed ButtonID: " + additionalData.getString("actionSelected");

        messageBody = message + "\n\nFull additionalData:\n" + additionalData.toString();
      }
    } catch (JSONException e) { }
    /*
    new AlertDialog.Builder(Main.currentActivity)
                   .setTitle(messageTitle)
                   .setMessage(messageBody)
                   .setCancelable(true)
                   .setPositiveButton("OK", null)
                   .create().show();
    */
    NotificationCompat.Builder mBuilder =
       new NotificationCompat.Builder(Main.currentActivity)
            .setSmallIcon(R.drawable.cc)
            .setContentTitle(messageTitle)

            .setDefaults(
                        Notification.DEFAULT_SOUND
                                | Notification.DEFAULT_VIBRATE
                                | Notification.FLAG_AUTO_CANCEL)  

            .setContentText(messageBody);

    resultIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);



    PendingIntent resultPendingIntent =
            PendingIntent.getActivity(
            Main.currentActivity,
            0,
            resultIntent,
            PendingIntent.FLAG_UPDATE_CURRENT
            | PendingIntent.FLAG_ONE_SHOT
        );    


    mBuilder.setContentIntent(resultPendingIntent);

   NotificationManager mNotifyMgr = 
            (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

   mNotifyMgr.notify(001, mBuilder.build());

  }
}
}

結果アクティビティ.java:

    public class ResultActivity extends Activity {
        /** Called when the activity is first created. */
         @Override
         protected void onCreate(Bundle savedInstanceState) {
          // TODO Auto-generated method stub
          super.onCreate(savedInstanceState);
          /*
          ImageView image = new ImageView(this);
          image.setImageDrawable(getResources().getDrawable(R.drawable.ic_launcher));
          setContentView(image);
          Toast.makeText(getApplicationContext(), 
            "Do Something NOW", 
            Toast.LENGTH_LONG).show();
            */
          super.onCreate(savedInstanceState);
          setContentView(R.layout.splash);
          }
    }

マニフェスト:

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

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="21" />

    <uses-permission android:name="android.permission.INTERNET" />

<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<permission android:name="com.google.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<uses-permission android:name="com.google.permission.C2D_MESSAGE" />



    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >

        <meta-data android:name="com.google.android.gms.version"
           android:value="@integer/google_play_services_version" />
        <activity android:name="com.onesignal.NotificationOpenedActivity"  android:theme="@android:style/Theme.NoDisplay">
            </activity>


        <receiver
         android:name="com.onesignal.GcmBroadcastReceiver"
         android:permission="com.google.android.c2dm.permission.SEND" >
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                <category android:name="com.google" />
            </intent-filter>
        </receiver>
        <service android:name="com.onesignal.GcmIntentService" />

        <activity android:name=".splashscreen" android:label="@string/app_name">
                <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>


        <activity android:name=".Main" android:label="@string/app_name" > 

        </activity>


        <activity android:name=".ResultActivity"
           android:label="@string/app_name"
           android:exported="true">
        </activity>



         <receiver
            android:name="com.google.OneSignalBackgroundDataReceiver"
            android:exported="false">
            <intent-filter>
            <action android:name="com.onesignal.BackgroundBroadcast.RECEIVE" />
            </intent-filter>
         </receiver>


    </application>

</manifest>

私はこれらすべての答えを試しましたが、どれもうまくいきませんでした:

通知 開いていません アクティビティ onCLick

Android ステータス バーの通知 - 通知を選択したときに正しいアクティビティを開く

Android :プッシュ通知をタップしてもアプリケーションが開かない

通知の Android クリックで、添付されたアクティビティが開かない

1 行を変更してデバイスでテストするのは大変です。onesignal はデバイスでのテストのみを許可するためです。助けてください、または少なくともデバッグ方法を教えてください。

apk がテストされたデバイス: Lolipop を実行している Samsung Galaxy S4。

4

2 に答える 2

10

このリンクを見てください: https://documentation.onesignal.com/docs/android-customizations#section-background-data-and-notification-overriding (検索: 「通知のオープン アクションの変更」ページで正確な段落に移動します)。

これは例です: http://androidbash.com/android-push-notification-service-using-onesignal/

あなたのコードを注意深く読む時間はありませんが、いくつか問題があるようです:

  1. 間違った場所で OneSignal を初期化します。

    「 Applicationクラスの onCreate メソッドで setNotificationOpenedHandler を使用して OneSignal を初期化していることを確認してください 。このコールバックから startActivity を呼び出す必要があります」(OneSignal のドキュメント)。

  2. インテントをキャッチしてターゲット アクティビティを開くためにAndroidManifestに他のレシーバーは必要ありません。OneSignal.NotificationOpenedHandler は既にこれを処理しています。ただし、OneSignal がラ​​ンチャー アクティビティを開くのを防ぐために、次の行を忘れないでください。

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

アプリでこのソリューションを使用していますが、正常に動作します。その通りだから。

于 2017-03-07T10:10:59.937 に答える
3

OneSignal.initランチャー アクティビティから呼び出す必要があるため、splashscreenアクティビティに移動する必要があります。これによりExampleNotificationOpenedHandler、OneSignal 通知を開いたときに起動します。

また、呼び出しをスプラッシュスクリーン アクティビティにコピーしてくださいOneSignal.onPaused();。これらは、およびメソッドOneSignal.onResumed();のすべてのアクティビティで呼び出す必要があります。onPuase()onResume()

于 2015-08-11T19:07:27.223 に答える