안드로이드 C2DM 구현하기
추후에 작업이 되는대로 서버연동하여 서로 다른 휴대폰 간에 메세지를 전송하는 법도 같이 올리도록 하겠습니다.
C2DM은 안드로이드 2.2 이상부터 지원이 되기 때문에 반드시 그 이상의 버전으로 테스트 하시기 바랍니다. 전 2.3에서 테스트를 했습니다.
원래 C2DM을 사용하기 위한 등록과정이 있는데 이부분은 다른 사이트를 참고 하시기 바랍니다.
먼저 메인 코드 입니다.
public class C2MDTestOneActivity extends Activity {
Button sendBtn;
EditText et;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
sendBtn = (Button) findViewById(R.id.button1);
et = (EditText) findViewById(R.id.editText1);
// C2DM 등록ID 발급
Intent registrationIntent = new Intent("com.google.android.c2dm.intent.REGISTER");
registrationIntent.putExtra("app", PendingIntent.getBroadcast(this, 0, new Intent(), 0));
registrationIntent.putExtra("sender", "구글에 등록된 메일주소"); // 개발자ID
startService(registrationIntent); // 서비스 시작(등록ID발급받기)
// 위에서 지정한 "app"와 "sender"은 맘대로 지정하시는게 아니라 구글에서 필요한 변수 명들입니다.
sendBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
try {
// 메시지를 보낼때 sender(발급받은 ID, 토큰인증값, 메시지)
sender(C2dm_BroadcastReceiver.registration_id, getAuthToken(), et.getText().toString());
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public void sender(String regId,String authToken,String msg) throws Exception{
StringBuffer postDataBuilder = new StringBuffer();
postDataBuilder.append("registration_id="+regId); //등록ID
postDataBuilder.append("&collapse_key=1");
postDataBuilder.append("&delay_while_idle=1");
postDataBuilder.append("&data.msg="+URLEncoder.encode(msg, "UTF-8")); //태울 메시지
byte[] postData = postDataBuilder.toString().getBytes("UTF8");
URL url = new URL("https://android.apis.google.com/c2dm/send");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
conn.setRequestProperty("Content-Length", Integer.toString(postData.length));
conn.setRequestProperty("Authorization", "GoogleLogin auth=" + authToken);
OutputStream out = conn.getOutputStream();
out.write(postData);
out.close();
conn.getInputStream();
}
public String getAuthToken() throws Exception{
String authtoken = "";
StringBuffer postDataBuilder = new StringBuffer();
postDataBuilder.append("accountType=HOSTED_OR_GOOGLE"); //똑같이 써주셔야 합니다.
postDataBuilder.append("&Email=구글에등록된메일주소"); //개발자 구글 id
postDataBuilder.append("&Passwd=비밀번호"); //개발자 구글 비빌번호
postDataBuilder.append("&service=ac2dm");
postDataBuilder.append("&source=test-1.0");
byte[] postData = postDataBuilder.toString().getBytes("UTF8");
URL url = new URL("https://www.google.com/accounts/ClientLogin");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
conn.setRequestProperty("Content-Length", Integer.toString(postData.length));
OutputStream out = conn.getOutputStream();
out.write(postData);
out.close();
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String sidLine = br.readLine();
String lsidLine = br.readLine();
String authLine = br.readLine();
System.out.println("sidLine----------->>>"+sidLine);
System.out.println("lsidLine----------->>>"+lsidLine);
System.out.println("authLine----------->>>"+authLine);
System.out.println("AuthKey----------->>>"+authLine.substring(5, authLine.length()));
authtoken = authLine.substring(5, authLine.length());
return authtoken;
}
} 다음은 메세지를 수신할 BroadcastReceive입니다.
public class C2dm_BroadcastReceiver extends BroadcastReceiver{
static String registration_id = null;
static String c2dm_msg = "";
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals("com.google.android.c2dm.intent.REGISTRATION")) {
handleRegistration(context, intent);
} else if (intent.getAction().equals("com.google.android.c2dm.intent.RECEIVE")) {
c2dm_msg = intent.getExtras().getString("msg");
System.out.println("c2dm_msg======>"+c2dm_msg);
Toast toast = Toast.makeText(context, "메시지 도착!\n"+c2dm_msg, Toast.LENGTH_SHORT );
toast.setGravity( Gravity.TOP | Gravity.CENTER, 0, 150 );
toast.show();
}
}
private void handleRegistration(Context context, Intent intent) {
registration_id = intent.getStringExtra("registration_id");
System.out.println("registration_id====>"+registration_id);
if (intent.getStringExtra("error") != null) {
Log.v("C2DM_REGISTRATION",">>>>>" + "Registration failed, should try again later." + "<<<<<");
} else if (intent.getStringExtra("unregistered") != null) {
Log.v("C2DM_REGISTRATION",">>>>>" + "unregistration done, new messages from the authorized sender will be rejected" + "<<<<<");
} else if (registration_id != null) {
System.out.println("registration_id complete!!");
}
}
}
마지막은 메너페스트 파일입니다.
<?xml version="1.0" encoding="utf-8"?>
마지막은 메너페스트 파일입니다.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="패키지명"
android:versionCode="1"
android:versionName="1.0" >
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:name="패키지명.C2MDTestOneActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name=".C2dm_BroadcastReceiver"
android:permission="com.google.android.c2dm.permission.SEND">
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE"/>
<category android:name="패키지명"/>
</intent-filter>
<intent-filter>
<action android:name="com.google.android.c2dm.intent.REGISTRATION"/>
<category android:name="패키지명"/>
</intent-filter>
</receiver>
</application>
<permission android:name="패키지명.permission.C2D_MESSAGE" android:protectionLevel="signature"/>
<uses-permission android:name="패키지명.permission.C2D_MESSAGE"/>
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-sdk android:minSdkVersion="10" />
</manifest>
위와 같이 작업하시고 실행하시면 돌아갈겁니다.
무엇보다 조심하실건 붉은 색으로 표시된 부분으며 매너페스트파일에서 패키지명을 잘 확인해주세요.
출처 : http://www.androidside.com/bbs/board.php?bo_table=B46&wr_id=14705#c14706
위와 같이 작업하시고 실행하시면 돌아갈겁니다.
무엇보다 조심하실건 붉은 색으로 표시된 부분으며 매너페스트파일에서 패키지명을 잘 확인해주세요.
출처 : http://www.androidside.com/bbs/board.php?bo_table=B46&wr_id=14705#c14706
'프로그래밍 > 안드로이드' 카테고리의 다른 글
[안드로이드/Android] Installation failed due to invalid APK file (3) | 2012.05.11 |
---|---|
[안드로이드/Andoird] 안드로이드 액티비티와 태스크 (0) | 2012.05.10 |
[안드로이드 팁] 구문분석 오류 패키지를 구문 분석하는 중 문제가 발생했습니다. (0) | 2012.05.10 |
[안드로이드/Android] android:launchMode="singleTask" 와 액티비티간의 통신, startActivityForResult 에 대한 여러가지 삽질들. (0) | 2012.05.10 |
[안드로이드/Android] 안드로이드 레이아웃 TableLayout (0) | 2012.05.09 |
[안드로이드/Android] 안드로이드 레이아웃 FrameLayout (0) | 2012.05.09 |
[안드로이드/Android] 안드로이드 레이아웃 RelativeLayout (4) | 2012.05.09 |
[안드로이드/Android]안드로이드 레이아웃 LinearLayout (0) | 2012.05.09 |
[안드로이드/Android]안드로이드 레이아웃 (2) | 2012.05.09 |