質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

2回答

4420閲覧

取得したレジストレーションID(プッシュ通知)を自分のサーバーへ送信したい。

hiroppii

総合スコア38

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2016/01/27 03:04

編集2016/01/27 03:05

###前提・実現したいこと
現在、Google Cloud Messagingを使ったプッシュ通知を作っています。
取得したレジストレーションID(プッシュ通知)を自分のサーバーへ送信したいです。

###発生している問題
取得したレジストレーションIDをサーバーへ送信したいのですが、POSTしてもPHP側でデータを取得できません。
さくらサーバーでは、HttpURLConnectionを使ったPOST送信は出来ないと書いてあるサイトもあったり、java側では、何のエラーも出ていないので、困っています。

サーバーのアクセスログを調べましたが、アクセス履歴もない状態です。

ソースコードが間違えている可能性もあるかと思いますので、一応載せておきます。

###ソースコード

public class MainActivity extends AppCompatActivity { // GCM関連 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; // デベロッパーコンソールで取得したプロジェクト番号 private static final String SENDER_ID = "プロジェクト番号"; private GoogleCloudMessaging gcm; private String registrationId = ""; private static Context context; private AsyncTask<Void, Void, String> registerTask; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); gcmRegister(); } /** * GCMのレジストレーションIDを取得 */ private void gcmRegister() { context = getApplicationContext(); if (checkPlayServices()) { gcm = GoogleCloudMessaging.getInstance(context); registrationId = getRegistrationId(); } else { Log.d("MainActivity", "端末にGooglePlayServiceAPKがありません"); } if (registrationId.equals("")) { registerTask = new AsyncTask<Void, Void, String>() { @Override protected String doInBackground(Void... params) { if (gcm == null) { gcm = GoogleCloudMessaging.getInstance(context); } try { registrationId = gcm.register(SENDER_ID); sendRegistrationIdToAppServer(registrationId); storeRegistrationId(registrationId); } catch (IOException e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(String resultPostExecute) { registerTask = null; } }; registerTask.execute(null, null, null); } } /** * 端末のGooglePlayServiceAPKの有無をチェック */ private boolean checkPlayServices() { final int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this); if (resultCode != ConnectionResult.SUCCESS) { if (GooglePlayServicesUtil.isUserRecoverableError(resultCode)) { GooglePlayServicesUtil.getErrorDialog(resultCode, this, PLAY_SERVICES_RESOLUTION_REQUEST).show(); } else { finish(); } return false; } return true; } /** * 端末に保存されているレジストレーションIDの取得 */ private String getRegistrationId() { final SharedPreferences prefs = getGCMPreferences(); registrationId = prefs.getString(PROPERTY_REG_ID, ""); try { if (registrationId.equals("")) { return ""; } } catch (Exception e) { return ""; } final int registeredVersion = prefs.getInt(PROPERTY_APP_VERSION, Integer.MIN_VALUE); final int currentVersion = getAppVersion(); if (registeredVersion != currentVersion) { return ""; } return registrationId; } /** * アプリケーションのバージョン情報を取得する */ private static int getAppVersion() { try { final PackageInfo packageInfo = context.getPackageManager() .getPackageInfo(context.getPackageName(), 0); return packageInfo.versionCode; } catch (PackageManager.NameNotFoundException e) { throw new RuntimeException("パッケージが見つかりません:" + e); } } /** * アプリのプリファレンスを取得する */ private SharedPreferences getGCMPreferences() { return getSharedPreferences(MainActivity.class.getSimpleName(), Context.MODE_PRIVATE); } /** * レジストレーションIDの端末保存 */ private void storeRegistrationId(String regId) { final SharedPreferences prefs = getGCMPreferences(); final int appVersion = getAppVersion(); final SharedPreferences.Editor editor = prefs.edit(); editor.putString(PROPERTY_REG_ID, regId); editor.putInt(PROPERTY_APP_VERSION, appVersion); editor.apply(); } /** * 取得したレジストレーションIDをサーバーへ送信 */ private boolean sendRegistrationIdToAppServer(String regId){ String serverUrl = "http://自作サイト"; Map<String, String> params = new HashMap<String, String>(); params.put("my_id", regId); try { post(serverUrl, params); return true; } catch (IOException e) { e.printStackTrace(); } return false; } /** * HttpURLConnectionを使ってPOST送信 */ 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<Map.Entry<String, String>> iterator = params.entrySet().iterator(); while (iterator.hasNext()) { Map.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(); } } }

###補足情報(言語/FW/ツール等のバージョンなど)
サーバーは、さくらVPSを使用しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

非同期処理を使った場合、きちんとpost出来ました。

投稿2016/03/05 09:59

hiroppii

総合スコア38

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

さくらサーバーでは、HttpURLConnectionを使ったPOST送信は出来ないと書いてあるサイトもあったり、java側では、何のエラーも出ていないので、困っています。

なるほどです。
サーバーの仕様かもしれませんね・・・
GETでは、アクセス履歴はくるんですかね?

投稿2016/01/28 01:50

ueno

総合スコア221

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hiroppii

2016/03/05 09:53 編集

すみません。GETでのアクセス履歴については調べていません。 ただ、非同期処理を使った場合、きちんとpost出来たので、それが原因なのかな?とも思いました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問