BLOG main image
분류 전체보기 (74)
Cocos2d (9)
낙서장 (4)
스토리지 (1)
안드로이드 (54)
유용한링크 (1)
모바일게임 (2)
추천앱 (1)
아이폰 (0)
맛집/여행 (1)
ナイトウェアメンズ
ナイトウェアメンズ
割烹着 オシャレ
割烹着 オシャレ
klicken Sie einfach auf die bi..
klicken Sie einfach auf die bi..
スポーツ
スポーツ
サンダル
サンダル
285,523 Visitors up to today!
Today 3 hit, Yesterday 15 hit
daisy rss
tistory 티스토리 가입하기!
2012.11.05 15:40
  


- php 를 사용한 gcm 푸시예제입니다.

- 안드로이드 폰에 RegistrationId 를  mysql 서버에 저장하고 서버에서 gcm 메시지를 전송하는 예제입니다. 


1. mysql에 gcm_table 이라는 테이블을 만들고 reg_id,phone_num 칼럼을 만들어 줍니다(phone_num 은 폰번호인데..폰번호를 함부로 수집하면 안되겠죠^^;, 쓸데없는 칼럼이지만 그냥 만들어봤습니다;) -> 이건 생략하겠습니다


2. 앱 시작 시 RegistrationId를 만들고 php를 이용해 서버에 인서트 해줍니다. 


3. gcm.jar를 안드로이드 프로젝트 libs 폴더에 등록해줍니다.


gcm.jar



---------------------------------------------------------------------------------------------------------

앱시작시 RegistrationId 등록 클래스 : MainActivity .java


public class MainActivity extends Activity {

 AsyncTask<?, ?, ?> regIDInsertTask;

  TextViewmessage;

 ProgressDialog loagindDialog;

 String regId ;

    String myResult ;

 

    @Override

    public void onCreate(Bundle savedInstanceState){

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);


        message=(TextView)findViewById(R.id.re_message);

          if(GCMIntentService.re_message!=null){

         message.setText(GCMIntentService.re_message);

          }else{

          registerGcm();

          }

    }

    

    public void registerGcm() {

     GCMRegistrar.checkDevice(this);

     GCMRegistrar.checkManifest(this);


       regId = GCMRegistrar.getRegistrationId(this);


     if (regId.equals("")) {

      GCMRegistrar.register(this, "프로젝트ID");

     } else {

      Log.e("reg_id", regId);

     }

  sendAPIkey();

    }

    

private void sendAPIkey() {

String  myNum="폰번호에요";

regIDInsertTask = new regIDInsertTask().execute(regId, myNum);

}


private class regIDInsertTask extends AsyncTask<String, Void, Void> {

@Override

protected void onPreExecute() {

super.onPreExecute();

loagindDialog = ProgressDialog.show(MainActivity.this, "키 등록 중입니다..",

"Please wait..", true, false);

}


@Override

protected Void doInBackground(String... params) {

HttpPostData(params[0] , params[1]);

return null;

}

protected void onPostExecute(Void result) {

loagindDialog.dismiss();

}

}


public void HttpPostData(String reg_id , String pnum) { 

    try { 

         URL url = new URL("http://서버URL/gcm_reg_insert.php");       // URL 설정 

         HttpURLConnection http = (HttpURLConnection) url.openConnection();   // 접속 

         //-------------------------- 

         //   전송 모드 설정 - 기본적인 설정이다 

         //-------------------------- 

         http.setDefaultUseCaches(false);                                            

         http.setDoInput(true);                        

         http.setDoOutput(true);                     

         http.setRequestMethod("POST");         


         http.setRequestProperty("content-type", "application/x-www-form-urlencoded"); 

         StringBuffer buffer = new StringBuffer(); 

         buffer.append("reg_id").append("=").append(reg_id).append("&");                 // php 변수에 값 대입 

         buffer.append("pnum").append("=").append(pnum);

        

         OutputStreamWriter outStream = new OutputStreamWriter(http.getOutputStream(), "EUC-KR"); 

         PrintWriter writer = new PrintWriter(outStream); 

         writer.write(buffer.toString()); 

         writer.flush(); 

         InputStreamReader tmp = new InputStreamReader(http.getInputStream(), "EUC-KR");  

         BufferedReader reader = new BufferedReader(tmp); 

         StringBuilder builder = new StringBuilder(); 

         String str; 

         while ((str = reader.readLine()) != null) {    

              builder.append(str + "\n");                 

   } 

         

          myResult = builder.toString();              

        

    } catch (MalformedURLException e) { 

           // 

    } catch (IOException e) { 

           //  

    } // try 

} // HttpPostData 


}


---------------------------------------------------------------------------------------------------------

activity_main.xml


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="match_parent"   android:orientation="vertical"

    android:layout_height="match_parent" >

    <Button     android:id="@+id/btn1"

        android:layout_width="200dip"

        android:layout_height="50dip"  android:text="받은메시지" />

      <TextView

        android:id="@+id/re_message"

        android:layout_width="match_parent"

        android:layout_height="50dip"

        android:background="#ffffff"

       />

</LinearLayout>

---------------------------------------------------------------------------------------------------------

RegistrationId 인서트 해주는 php : gcm_reg_insert.php


<?php

 

$response = array();

 

if (isset($_POST['reg_id']) && isset($_POST['pnum']) ) {

 

    $reg_id = $_POST['reg_id'];

    $pnum = $_POST['pnum'];

echo $reg_id,$pnum;

 

    $connect = mysql_connect("서버URL","아이디","비밀번호") or die("SQL server에 연결할 수 없습니다."); 

mysql_select_db("DB명",$connect);


    $result = mysql_query("INSERT INTO gcm_table(reg_id, phone_num) VALUES('$reg_id', '$pnum')");

 


    if ($result) {

        // successfully inserted into database

        $response["success"] = 1;

        $response["message"] = "Product successfully created.";

 

        echo json_encode($response);

    } else {

        // failed to insert row

        $response["success"] = 0;

        $response["message"] = "Oops! An error occurred.";

 

        echo json_encode($response);

    }

} else {

    // required field is missing

    $response["success"] = 0;

    $response["message"] = "Required field(s) is missing";

 

    echo json_encode($response);

}

?>

----------------------------------------------------------------------------------------------

GCMRegistrar.register(this, "프로젝트ID");

-> https://code.google.com/apis/console/b/0/ 로 연결해서 구글 계정으로 로그인하면  project:숫자가 뜹니다 

project 옆에 숫자가 프로젝트ID 입니다;


$connect = mysql_connect("서버URL","아이디","비밀번호") or die("SQL server에 연결할 수 없습니다.");      mysql_select_db("DB명",$connect);

-> 자신의 서버 정보를 적어주세요...^^;



길어서...다음편에 계속됩니다...



질문드립니다 | 2012.11.15 19:46 | PERMALINK | EDIT/DEL | REPLY
올려주신 자료대로 만들었는데
작동을 하지 않습니다 ㅜㅜ;;
질문드립니다 | 2012.11.15 20:03 | PERMALINK | EDIT/DEL | REPLY
안되는게 서버에 db에 reg_id 저장이 안되네요
어플리케이션 키면 gcm_reg_insert.php 에 접속하는지도 불분명합니다.
어떤걸 해야되나요 ㅜㅜ
루틴 | 2012.11.16 11:05 신고 | PERMALINK | EDIT/DEL | REPLY
앱 실행시키면 reg_id를 얻어온 후에 gcm_reg_insert.php로 포스트를 보내고 있습니다
앱 중간 중간에 log넣어 보시고 reg_id값을 얻어 오는지 gcm_reg_insert.php로 값이 제대로 전달 되는지 확인해 보셔야 원인을 파악할 수 있을것 같습니다

소스를 약간 수정했으니 다시 살펴보시길 바랍니다

이거 꼭 | 2012.11.21 02:52 | PERMALINK | EDIT/DEL | REPLY
좋은글 잘 보고갑니다. 여쭤볼게 있는데 안드로이드 mainActivity.java 에서
AsyncTask<?, ?, ?> regIDInsertTask; 부분과

그밑에 onCreate 에서 message부분이 에러가 뜨는데 어떻게 처리하면 될까요?!
이거 꼭 | 2012.11.21 03:50 | PERMALINK | EDIT/DEL | REPLY
잘되는데 db에 reg_id는 저장이 되는데 메시지가 안보내 지네요ㅠ
부탁드립니다. | 2013.02.20 18:04 | PERMALINK | EDIT/DEL | REPLY
동아리 홈페이지를 만들고 있습니다.
어플도 같이 개발하구 있구요.
GCM서비스로 푸쉬공지를 전달할려구 어플 개발중에 있는데 이 소스가 꼭 필요할것 같습니다.
GCM만 매달린지 보름은 된거 같아요..
소스를 일일이 쳐봐도 에러가 떠서 잡을수가 없구요 .. APK는 이클립스로 열수가 없어서 그렇습니다.
클라이언트쪽 소스를 부탁드려도 될까요??
루틴 | 2013.02.22 09:44 신고 | PERMALINK | EDIT/DEL
클라이언트까지 다 구현된 예제인데요..
어느부분이 안되는지 정확하게 말씀해주세요..
import는 | 2013.02.20 21:21 | PERMALINK | EDIT/DEL | REPLY
import설정은 어떻게되어있는지 궁금합니다
루틴 | 2013.02.22 09:45 신고 | PERMALINK | EDIT/DEL
gcm.jar를 libs 폴더에 복사해서 넣어주시면 import 문제는 없을듯합니다
첨부해 놓겠습니다.
부탁드립니다. | 2013.02.23 20:43 | PERMALINK | EDIT/DEL | REPLY
DB 저장 부분이 안되네요
DB 만들때 세부정보를 어떻게 설정해야 하나요??
답변해주세요 | 2013.02.25 14:59 | PERMALINK | EDIT/DEL | REPLY
앱 시작 시 RegistrationId를 만들고 php를 이용해 서버에 인서트 해줍니다.
이것은 어떻게 하는 것인가요??ㅠㅠㅠㅠㅠㅠ
감사합니다 | 2013.04.02 22:46 | PERMALINK | EDIT/DEL | REPLY
예제대로 잘 보고 만들었으나

send_message.php 실행시

"registration_ids" field cannot be empty

라고 뜨는데 이부분 필드 어떻게 만드셨나요??
Name
Password
Homepage
Secret