How to implement a GCM Hello World for Android using Android Studio

后端 未结 1 588
青春惊慌失措
青春惊慌失措 2020-11-29 09:44

I have been searching for some days now how to implement Google Cloud Messaging for Android, but I\'m with some serious doubts about it.

I mean, apparently Google pu

相关标签:
1条回答
  • 2020-11-29 10:27

    If you have read the two links in your question and understood GCM key concepts, then you can refer to the following sample codes:

    Of course, let's assume that you have finished:

    • Create a project and its server API key at Google Developers Console
    • Set permissions in your AndroidManifest files like this <uses-permission android:name="android.permission.INTERNET" />

    Server side:

    public class MainActivity extends AppCompatActivity {
    
        private TextView mTextView;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            mTextView = (TextView) findViewById(R.id.textView);
    
            new GCMRequest().execute();
        }
    
        ...    
    
        private class GCMRequest extends AsyncTask<Void, Void, String> {
    
            @Override
            protected String doInBackground(Void... voids) {
    
                final String API_KEY = "..."; // An API key saved on the app server that gives the app server authorized access to Google services
                final String CLIENT_REG_ID = "..."; //An ID issued by the GCM connection servers to the client app that allows it to receive messages
                final String postData = "{ \"registration_ids\": [ \"" + CLIENT_REG_ID + "\" ], " +
                        "\"delay_while_idle\": true, " +
                        "\"data\": {\"tickerText\":\"My Ticket\", " +
                        "\"contentTitle\":\"My Title\", " +
                        "\"message\": \"Test GCM message from GCMServer-Android\"}}";
    
                try {                        
                    URL url = new URL("https://android.googleapis.com/gcm/send");
                    HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
                    urlConnection.setDoInput(true);
                    urlConnection.setDoOutput(true);
                    urlConnection.setRequestMethod("POST");
                    urlConnection.setRequestProperty("Content-Type", "application/json");
                    urlConnection.setRequestProperty("Authorization", "key=" + API_KEY);
    
                    OutputStream outputStream = new BufferedOutputStream(urlConnection.getOutputStream());
                    BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream, "utf-8"));
                    writer.write(postData);
                    writer.flush();
                    writer.close();
                    outputStream.close();
    
                    int responseCode = urlConnection.getResponseCode();
                    InputStream inputStream;
                    if (responseCode < HttpURLConnection.HTTP_BAD_REQUEST) {
                        inputStream = urlConnection.getInputStream();
                    } else {
                        inputStream = urlConnection.getErrorStream();
                    }
                    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
                    String temp, response = "";
                    while ((temp = bufferedReader.readLine()) != null) {
                        response += temp;
                    }
                    return response;
                } catch (IOException e) {
                    e.printStackTrace();
                    return e.toString();
                }
            }
    
            @Override
            protected void onPostExecute(String message) {
                super.onPostExecute(message);
    
                if (mTextView != null) {
                    try {
                        JSONObject jsonObject = new JSONObject(message);
                        mTextView.setText(jsonObject.toString(5));
                    } catch (JSONException e) {
                        e.printStackTrace();
                        mTextView.setText(e.toString());
                    }
                }
            }
        }
    }
    

    Client-side:

    MainActivity.java:

    public class MainActivity extends AppCompatActivity {
    
        private final Context mContext = this;
        private final String SENDER_ID = "..."; // Project Number at https://console.developers.google.com/project/...
        private final String SHARD_PREF = "com.example.gcmclient_preferences";
        private final String GCM_TOKEN = "gcmtoken";    
        public static TextView mTextView;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            SharedPreferences appPrefs = mContext.getSharedPreferences(SHARD_PREF, Context.MODE_PRIVATE);
            String token = appPrefs.getString(GCM_TOKEN, "");
            if (token.isEmpty()) {
                try {
                    getGCMToken();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
    
            mTextView = (TextView) findViewById(R.id.textView);
        }
    
        ...    
    
        private void getGCMToken() {
            new AsyncTask<Void, Void, Void>() {
                @Override
                protected Void doInBackground(Void... params) {
                    try {
                        InstanceID instanceID = InstanceID.getInstance(mContext);
                        String token = instanceID.getToken(SENDER_ID, GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);
                        if (token != null && !token.isEmpty()) {
                            SharedPreferences appPrefs = mContext.getSharedPreferences(SHARD_PREF, Context.MODE_PRIVATE);
                            SharedPreferences.Editor prefsEditor = appPrefs.edit();
                            prefsEditor.putString(GCM_TOKEN, token);
                            prefsEditor.apply();
                        }
                        Log.i("GCM", token);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    return null;
                }
            }.execute();
        }
    }
    

    GcmService.java:

    public class GcmService extends GcmListenerService {
    
        @Override
        public void onMessageReceived(String from, Bundle data) {
            JSONObject jsonObject = new JSONObject();
            Set<String> keys = data.keySet();
            for (String key : keys) {
                try {
                    jsonObject.put(key, data.get(key));
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
            try {
                sendNotification("Received: " + jsonObject.toString(5));
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    
        @Override
        public void onDeletedMessages() {
            sendNotification("Deleted messages on server");
        }
    
        @Override
        public void onMessageSent(String msgId) {
            sendNotification("Upstream message sent. Id=" + msgId);
        }
    
        @Override
        public void onSendError(String msgId, String error) {
            sendNotification("Upstream message send error. Id=" + msgId + ", error" + error);
        }
    
        private void sendNotification(final String msg) {
            Handler handler = new Handler(Looper.getMainLooper());
            handler.post(new Runnable() {
                @Override
                public void run() {                    
                    if (MainActivity.mTextView != null) {
                        MainActivity.mTextView.setText(msg);
                    }
                }
            });
        }
    }
    

    AndroidManifest.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.gcmandroid" >
    
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.GET_ACCOUNTS" />
        <uses-permission android:name="android.permission.WAKE_LOCK" />
        <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    
        <permission android:name="com.example.gcm.permission.C2D_MESSAGE"
            android:protectionLevel="signature" />
        <uses-permission android:name="com.example.gcm.permission.C2D_MESSAGE" />
    
        <application
            android:allowBackup="true"
            android:fullBackupContent="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
    
            <receiver
                android:name="com.google.android.gms.gcm.GcmReceiver"
                android:exported="true"
                android:permission="com.google.android.c2dm.permission.SEND" >
                <intent-filter>
                    <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
                    <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                    <category android:name="com.example.gcm" />
                </intent-filter>
            </receiver>
            <service android:name=".GcmService" android:exported="false">
                <intent-filter>
                    <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                </intent-filter>
            </service>
    
            <activity
                android:name=".MainActivity"
                android:label="@string/app_name" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    
    </manifest>
    
    0 讨论(0)
提交回复
热议问题