前提・実現したいこと
現在、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を使用しています。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
check解決した方法
0
非同期処理を使った場合、きちんとpost出来ました。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
さくらサーバーでは、HttpURLConnectionを使ったPOST送信は出来ないと書いてあるサイトもあったり、java側では、何のエラーも出ていないので、困っています。
なるほどです。
サーバーの仕様かもしれませんね・・・
GETでは、アクセス履歴はくるんですかね?
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.11%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる