2016-07-14 8 views
1

背景:偽造GCMメッセージ

私はアンドロイドのアプリ内でプッシュ通知を受けた偽の簡単な方法をしたいと思います。

SNSとGCMを使用してプッシュ通知を送信しますが、受信者の処理をテストするたびに実際の通知を送信する必要はありません。

私は、 'clear cache'、 'fake server error'などの項目を含むメインアクティビティに「dev menu」を作成しました。このリストに「偽のプッシュ通知」アイテムを追加しました。

GcmListenerServiceの私の実装で、プログラムでonMessageReceivedメソッドを呼び出すという考えは、メニュー項目が選択されたときに、プッシュ通知を受信することを偽っています。

問題

onMessageReceivedメソッドにアクセスするために、私は(ドキュメントごとなど)のように、私のマニフェストに定義されているサービスであるGcmListenerService、へのアクセス権を持っている必要があります:

<service 
    android:name=".service.MyGcmListenerService" 
    android:exported="false" > 
     <intent-filter> 
      <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
     </intent-filter> 
</service> 

私は既存のDagger2セットアップを使用してアクティビティにインスタンスを挿入しようとしましたが、ダガーに正しいインスタンスを提供する方法がわかりません。

NEWINGアップ新しいMyGcmListenerServiceは明らかにonMessageReceivedメソッドを呼び出しますが、私はテントを作成NPEを得るように、何のアプリケーション・コンテキストを持っていない:

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference 
at android.content.ContextWrapper.getPackageName(ContextWrapper.java:132) 
at android.content.ComponentName.<init>(ComponentName.java:128)at android.content.Intent.<init>(Intent.java:4868) 
at uk.co.blah.blah.service.MyGcmListenerService.onMessageReceived(MyGcmListenerService.java:30) 
at uk.co.blah.blah.DashboardActivity.onOptionsItemSelected(DashboardActivity.java:297) 
at android.app.Activity.onMenuItemSelected(Activity.java:3203) 

ダガープロバイダ:(私はこれが動作するように期待していません、その正しくないGcmListenerServiceなど)

@Provides 
@Singleton 
MyGcmListenerService provideMyGcmListenerService() { 
    return new MyGcmListenerService(); 
} 

メニュー項目ハンドラー:

if (id == R.id.fake_notification) { 
     Bundle bundle = new Bundle(); 
     bundle.putString("message", "Test notification"); 
     gcmListenerService.onMessageReceived("fakeNotification", bundle); 
} 
GcmListenerServiceの

私の実装:

public class MyGcmListenerService extends GcmListenerService { 

@Override 
public void onMessageReceived(String from, Bundle data) { 
    String message = data.getString("message"); 
    Timber.d("From: %s", from); 
    Timber.d("Message: %s", message); 

    // FIXME Fails here 
    Intent notificationAction = new Intent(this, DashboardActivity.class); 

    ... do some other stuff to create the notification 

} 

}

私はこのすべて間違っについて行くかもしれないと思うので、任意の他の技術に開いています。しかし、アプリの中で何かを含むオプション(いくつかの偽のサーバや何か)を提案してはいけません。アプリの中で通知をスプーフィングするだけです。ステークホルダーへの通知など

+0

主なアクティビティでfakeNotificationメソッドを作成し、onmessageに通知ビルダコードをコピーして貼り付けます。メニューから項目をクリックすると、このメソッドを呼び出すことができます –

+0

私はコピー貼り付けコードの大ファンではありませんが、これはうまくいくでしょう - あなたの提案に感謝します:) – OliverDeLange

答えて

1

おそらくMyGcmListenerService.onMessageReceivedに何らかのメソッドを呼び出して、テストで同じメソッドを呼び出すのが最も簡単です。

実際にMyGcmListenerServiceのインスタンスを作成する場合は、usual steps to start and connect to an Android Serviceに従う必要があります。

+0

あなたの最初の提案として、私は実際にonMessageReceivedによって呼び出されるいくつかのヘルパークラスへの通知を作成するビットをリファクタリングしています。 – OliverDeLange

0

なぜ複雑なのですか?どうやって独自のregistrationIdを保存し、そのregistrationIdを使って通知を送信して、プッシュ通知が動作するかどうかをテストしますか?

+0

はい、これもうまくいくでしょうアプリケーション自体からGCM APIを使用することを意味します...しかし、GCMエンドポイントを呼び出すデバッグHTTPクライアントを設定する必要があります。これは、メインコードベースを非運用コードで汚染することを意味します。これは私がアプリケーションの外部に行くことを好む理由の1つです – OliverDeLange

関連する問題