在Android应用中伪造GCM消息

时间:2016-07-14 12:34:07

标签: android google-cloud-messaging gcmlistenerservice

背景

我想在我的Android应用程序中伪造接收推送通知的简单方法。

我使用SNS和GCM发送推送通知,但是每次我测试我的接收器处理时,我都不想发送真实的通知。

我创建了一个开发菜单'在主要活动中包含'清除缓存'虚假服务器错误'等等,所以我添加了一个假推送通知'项目到此列表。 (这仅出现在调试版本中)

当我选择菜单项时,我会以编程方式调用onMessageReceived方法调用GcmListenerService方法,因此伪造了一个推送通知。

问题

为了访问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设置将实例注入活动,但我不知道如何提供&#39;匕首的正确实例。

新建一个新的MyGcmListenerService显然会调用onMessageReceived方法,但是没有应用程序上下文,所以在创建Intent时我得到一个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)

Dagger提供者:(我不希望这个工作,因为它不是正确的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

}

}

我想我可能会认为这一切都错了,所以对任何其他技术持开放态度。但是,请不要建议涉及应用程序外部内容的选项(某些虚假服务器或其他内容),因为这只是在应用程序中欺骗通知,仅使用应用程序中可用的操作...也很有用向利益相关者演示通知等。

2 个答案:

答案 0 :(得分:2)

MyGcmListenerService.onMessageReceived调用某种方法可能最简单,并且您的测试调用相同的方法。

但如果你真的想要实例化MyGcmListenerService,那么你需要关注usual steps to start and connect to an Android Service

答案 1 :(得分:0)

为什么这么复杂?你如何保存自己的registrationId,然后使用该registrationId发送通知来测试推送通知的工作与否?