import java.io.IOException;
import android.os.Bundle;
import android.os.Handler;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import com.google.android.gcm.GCMRegistrar;
import com.google.android.gcm.server.Message;
import com.google.android.gcm.server.Result;
import com.google.android.gcm.server.Sender;
import android.view.View;
import android.view.View.OnClickListener;
public class GCMActivity extends Activity {
final static String SENDER_ID = "18178958862"; // GCM 프로젝트 생성 시 발급 받은 Project_number
final static String SERVER_API_KEY = "AIzaSyDW9LITPiRxRi1OOAZjdHLd9PQqn-BYkJ0"; // API_ACCESS 페이지에서 받은 서버 API KEY
static final Handler mHandler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
GCMRegistrar.checkDevice(this);
GCMRegistrar.checkManifest(this);
String regId = GCMRegistrar.getRegistrationId(this);
if (regId.equals("")) {
GCMRegistrar.register(this, SENDER_ID);
} else {
Log.v("Main", "Already registered (" + regId + ")");
}
setContentView(R.layout.activity_main);
findViewById(R.id.button1).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
new Thread(new Runnable() {
@Override
public void run() {
// 서버 API_KEY 입력
Sender sender = new Sender(SERVER_API_KEY);
Message message = new Message.Builder()
.collapseKey(
String.valueOf(Math.random() % 100 + 1))
.delayWhileIdle(true).timeToLive(3)
.addData("no", "1").addData("title", "Hello")
.addData("msg", "GCM TEST").build();
try {
// 클라이언트 아이디를 가져온다.
String regId = GCMRegistrar
.getRegistrationId(GCMActivity.this);
Log.d("GCMIntentService", "send! : " + regId);
Result result = sender.send(message, regId, 5);
Log.v("GCMIntentService", "result : "
+ result.getCanonicalRegistrationId());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
}
});
}
@Override
protected void onPause() {
super.onPause();
if (!GCMRegistrar.getRegistrationId(this).equals("")) {
GCMRegistrar.unregister(this);
}
}
}import java.io.IOException;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;
import android.content.BroadcastReceiver;
import com.google.android.gcm.GCMBaseIntentService;
public class GCMIntentService extends GCMBaseIntentService {
public static String mID = "";
@Override
protected void onError(Context context, String errorId) {
// 기기 등록 실패 및 GCM 관련 오류
Log.v("GCMIntentService", "onError - " + errorId);
}
@Override
protected void onMessage(Context context, Intent intent) {
Log.v("GCMIntentService", "onMessage");
final String str = String.format("no: %s \ntitle: %s \nmsg: %s",
intent.getStringExtra("no"), intent.getStringExtra("title"),
intent.getStringExtra("msg"));
GCMActivity.mHandler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), "onMessage - " + str,
Toast.LENGTH_LONG).show();
}
});
}
// 기기 등록 후 호출
@Override
protected void onRegistered(Context context, String regId) {
// 기기 등록 성공
final String mID = regId;
GCMActivity.mHandler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(),
"onRegistered - " + mID, Toast.LENGTH_LONG).show();
}
});
Log.v("GCMIntentService", "onRegistered - " + regId);
}
// 기기 등록 해제 후 호출
@Override
protected void onUnregistered(Context context, String regId) {
Log.v("GCMIntentService", "onUnregistered - " + regId);
}
}
06-08 23:17:08.948: D/(4190): mali: REVISION=Linux-r2p4-02rel0 BUILD_DATE=Thu Oct 25 08:43:05 KST 2012
06-08 23:17:08.968: D/OpenGLRenderer(4190): Enabling debug mode 0
06-08 23:17:12.518: V/GCMBaseIntentService(4190): Intent service name: GCMIntentService-DynamicSenderIds-1
06-08 23:17:12.518: D/AndroidRuntime(4190): Shutting down VM
06-08 23:17:12.518: W/dalvikvm(4190): threadid=1: thread exiting with uncaught exception (group=0x419342a0)
06-08 23:17:12.523: E/AndroidRuntime(4190): FATAL EXCEPTION: main
06-08 23:17:12.523: E/AndroidRuntime(4190): java.lang.RuntimeException: Unable to instantiate receiver edu.example.gcmanother.GCMIntentService: java.lang.ClassCastException: edu.example.gcmanother.GCMIntentService cannot be cast to android.content.BroadcastReceiver
06-08 23:17:12.523: E/AndroidRuntime(4190): at android.app.ActivityThread.handleReceiver(ActivityThread.java:2261)
06-08 23:17:12.523: E/AndroidRuntime(4190): at android.app.ActivityThread.access$1600(ActivityThread.java:140)
06-08 23:17:12.523: E/AndroidRuntime(4190): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1313)
06-08 23:17:12.523: E/AndroidRuntime(4190): at android.os.Handler.dispatchMessage(Handler.java:99)
06-08 23:17:12.523: E/AndroidRuntime(4190): at android.os.Looper.loop(Looper.java:137)
06-08 23:17:12.523: E/AndroidRuntime(4190): at android.app.ActivityThread.main(ActivityThread.java:4921)
06-08 23:17:12.523: E/AndroidRuntime(4190): at java.lang.reflect.Method.invokeNative(Native Method)
06-08 23:17:12.523: E/AndroidRuntime(4190): at java.lang.reflect.Method.invoke(Method.java:511)
06-08 23:17:12.523: E/AndroidRuntime(4190): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027)
06-08 23:17:12.523: E/AndroidRuntime(4190): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
06-08 23:17:12.523: E/AndroidRuntime(4190): at dalvik.system.NativeStart.main(Native Method)
06-08 23:17:12.523: E/AndroidRuntime(4190): Caused by: java.lang.ClassCastException: edu.example.gcmanother.GCMIntentService cannot be cast to android.content.BroadcastReceiver
06-08 23:17:12.523: E/AndroidRuntime(4190): at android.app.ActivityThread.handleReceiver(ActivityThread.java:2256)
06-08 23:17:12.523: E/AndroidRuntime(4190): ... 10 more
06-08 23:17:23.588: I/Process(4190): Sending signal. PID: 4190 SIG: 9
동작시 이런 에러가 뜹니다. 저기 저 BroadcastReceiver는 어찌써야한다는 말인가요?
코드출처:Frog님 블로그