본문 바로가기

프로그래밍/안드로이드

[안드로이드] 안드로이드 C2DM 구현하기

안드로이드 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"?>
<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