/* * Copyright TechBooster/mhidaka, kei_i_t * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.techbooster.gcmsample; import java.io.IOException; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.GooglePlayServicesUtil; import com.google.android.gms.gcm.GoogleCloudMessaging; import org.techbooster.gcmsample.CommonUtilities; import android.os.AsyncTask; import android.os.Bundle; import android.app.Activity; import android.content.Context; import android.content.SharedPreferences; import android.content.pm.PackageInfo; import android.content.pm.PackageManager.NameNotFoundException; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class MainActivity extends Activity implements OnClickListener{ private static final String TAG = "TechBoosterSample"; public static final String EXTRA_MESSAGE = "message"; public static final String PROPERTY_REG_ID = "registration_id"; private static final String PROPERTY_APP_VERSION = "appVersion"; private final static int PLAY_SERVICES_RESOLUTION_REQUEST = 9000; GoogleCloudMessaging gcm; String regid; Context context; /** * サーバー通信用AsyncTask */ AsyncTask<Void, Void, Void> mRegisterTask; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button btnRegist = (Button) findViewById(R.id.btn_regist); btnRegist.setOnClickListener(this); Button btnUnregist = (Button) findViewById(R.id.btn_unregist); btnUnregist.setOnClickListener(this); context = getApplicationContext(); // デバイスにPlayサービスAPKが入っているか検証する if (checkPlayServices()) { gcm = GoogleCloudMessaging.getInstance(context); regid = getRegistrationId(context); } else { Log.i(TAG, "Google Play Services APKが見つかりません"); } } /* * PlayサービスのAPKチェック */ private boolean checkPlayServices() { int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this); if (resultCode != ConnectionResult.SUCCESS) { if (GooglePlayServicesUtil.isUserRecoverableError(resultCode)) { GooglePlayServicesUtil.getErrorDialog(resultCode, this, PLAY_SERVICES_RESOLUTION_REQUEST).show(); } else { Log.i(TAG, "Playサービスがサポートされていない端末です"); finish(); } return false; } return true; } /* * レジストレーションIDの取得 */ private String getRegistrationId(Context context) { final SharedPreferences prefs = getGCMPreferences(context); String registrationId = prefs.getString(PROPERTY_REG_ID, ""); // プリファレンスに格納されていない場合は空で返却 if (regid.equals("")) { Log.i(TAG, "レジストレーションIDが見つかりません"); return ""; } // アプリケーションがバージョンアップされていた場合、レジストレーションIDを必ずクリアしないといけません // すでにレジストレーションIDが存在していた場合、再生成は行いません。 int registeredVersion = prefs.getInt(PROPERTY_APP_VERSION, Integer.MIN_VALUE); int currentVersion = getAppVersion(context); if (registeredVersion != currentVersion) { Log.i(TAG, "アプリケーションバージョンが変更されています"); return ""; } return registrationId; } /* * アプリケーションバージョン情報を取得する */ private static int getAppVersion(Context context) { try { PackageInfo packageInfo = context.getPackageManager() .getPackageInfo(context.getPackageName(), 0); return packageInfo.versionCode; } catch (NameNotFoundException e) { throw new RuntimeException("パッケージ名が見つかりません : " + e); } } /* * SharedPreferencesを取得 */ private SharedPreferences getGCMPreferences(Context context) { return getSharedPreferences(MainActivity.class.getSimpleName(), Context.MODE_PRIVATE); } /* * レジストレーションIDの保存 */ private void storeRegistrationId(Context context, String regId) { final SharedPreferences prefs = getGCMPreferences(context); int appVersion = getAppVersion(context); Log.i(TAG, "レジストレーションIDを登録。登録時のアプリケーションバージョン: " + appVersion); SharedPreferences.Editor editor = prefs.edit(); editor.putString(PROPERTY_REG_ID, regId); editor.putInt(PROPERTY_APP_VERSION, appVersion); editor.commit(); } @Override protected void onResume() { super.onResume(); checkPlayServices(); } @Override protected void onDestroy() { if (mRegisterTask != null) { mRegisterTask.cancel(true); } gcm.close(); super.onDestroy(); } @Override public void onClick(View v) { if(v.getId() == R.id.btn_regist){ if (regid.equals("")) { // GCM登録用AsyncTaskの実行 mRegisterTask = new AsyncTask<Void, Void, Void>() { @Override protected Void doInBackground(Void... params) { if (gcm == null) { // インスタンスがなければ取得する gcm = GoogleCloudMessaging.getInstance(context); } try { // GCMサーバーへ登録する regid = gcm.register(CommonUtilities.SENDER_ID); } catch (IOException e) { e.printStackTrace(); } // レジストレーションIDを自分のサーバーへ送信する // レジストレーションIDをつかえば、アプリケーションにGCMメッセージを送信できるようになります Log.i(TAG,"送信対象のレジストレーションID: " + regid); register(regid); // レジストレーションIDを端末に保存 storeRegistrationId(context, regid); return null; } @Override protected void onPostExecute(Void result) { mRegisterTask = null; } }; mRegisterTask.execute(null, null, null); } }else if(v.getId() == R.id.btn_unregist){ //GCMサーバーから登録を解除するAsyncTaskの実行 mRegisterTask = new AsyncTask<Void, Void, Void>() { @Override protected Void doInBackground(Void... params) { if (gcm == null) { // インスタンスがなければ取得する gcm = GoogleCloudMessaging.getInstance(context); } try { // GCMサーバーの登録を解除する gcm.unregister(); } catch (IOException e) { e.printStackTrace(); } // レジストレーションIDを自分のサーバーでも削除する unregister(regid); return null; } @Override protected void onPostExecute(Void result) { mRegisterTask = null; } }; mRegisterTask.execute(null, null, null); } } /* * */ public static boolean register(String regId) { String serverUrl = CommonUtilities.SERVER_URL + "/register.php"; Map<String, String> params = new HashMap<String, String>(); params.put("regId", regId); try { post(serverUrl, params); return true; } catch (IOException e) { e.printStackTrace(); } return false; } public static void unregister(String regId) { String serverUrl = CommonUtilities.SERVER_URL + "/unregister.php"; Map<String, String> params = new HashMap<String, String>(); params.put("regId", regId); try { post(serverUrl, params); } catch (IOException e) { } } public static void post(String endpoint, Map<String, String> params) throws IOException { URL url; try { url = new URL(endpoint); } catch (MalformedURLException e) { throw new IllegalArgumentException("invalid url: " + endpoint); } StringBuilder bodyBuilder = new StringBuilder(); Iterator<Entry<String, String>> iterator = params.entrySet().iterator(); // POSTするパラメータ while (iterator.hasNext()) { Entry<String, String> param = iterator.next(); bodyBuilder.append(param.getKey()).append('=') .append(param.getValue()); if (iterator.hasNext()) { bodyBuilder.append('&'); } } String body = bodyBuilder.toString(); byte[] bytes = body.getBytes(); HttpURLConnection conn = null; try { conn = (HttpURLConnection) url.openConnection(); conn.setDoOutput(true); conn.setUseCaches(false); conn.setFixedLengthStreamingMode(bytes.length); conn.setRequestMethod("POST"); conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8"); // ポスト送信 OutputStream out = conn.getOutputStream(); out.write(bytes); out.close(); // サーバーレスポンス受信 int status = conn.getResponseCode(); if (status != 200) { throw new IOException("Post failed with error code " + status); } } finally { if (conn != null) { conn.disconnect(); } } } }