发件人ID用于c2dm的注册过程.但是没有接收消息或任何注册ID.
public class Akashc2dmActivity extends Activity implements OnClickListener { Button Register,id; private static PowerManager.WakeLock mWakeLock; private static final String WAKELOCK_KEY = "C2DM_LIB"; @Override protected void onCreate(Bundle savedInstanceState) { if (mWakeLock == null) { PowerManager pm = (PowerManager) Akashc2dmActivity.this .getSystemService(Context.POWER_SERVICE); mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,WAKELOCK_KEY); } super.onCreate(savedInstanceState); setContentView(R.layout.main); Register = (Button) findViewById(R.id.button); Register.setonClickListener(this); } public void sendRequest(View ignored) { Log.d("Register","hello"); Intent registrationIntent = new Intent(Constants.SEND_REGISTRATION_TO_GOOGLE); iHaveNoClueWhatThisSettingDoesButItIsrequiredForTheIntentToWorkSoIBetterSetIt(registrationIntent); registrationIntent.putExtra("sender",Constants.C2DM_APPLICATION_SERVER_ID); startService(registrationIntent); } private void iHaveNoClueWhatThisSettingDoesButItIsrequiredForTheIntentToWorkSoIBetterSetIt(Intent registrationIntent) { registrationIntent.putExtra("app",PendingIntent.getbroadcast(Akashc2dmActivity.this,new Intent(),0)); Log.d("app",""+PendingIntent.getbroadcast(Akashc2dmActivity.this,0)); } @Override public void onClick(View v) { if(v == Register){ sendRequest(Register); } }
}
// Constants.java文件
public class Constants { public static final String TAG = "c2dm"; public static final String REGISTRATION_INTENT = "com.google.android.c2dm.intent.REGISTER"; public static final String SEND_REGISTRATION_TO_GOOGLE = "com.google.android.c2dm.intent.REGISTER"; public static final String RECEIVED_REGISTRATION_ID_FROM_GOOGLE = "com.google.android.c2dm.intent.REGISTRATION"; public static final String RECEIVED_C2DM_MESSAGE_FROM_GOOGLE = "com.google.android.c2dm.intent.RECEIVE"; public static final String START_C2DM_SERVICE = "com.google.android.c2dm.intent.START_SERVICE"; public static final String C2DM_APPLICATION_SERVER_ID = "akash.singh55@gmail.com"; private Constants() { } }
//CDDMbroadcastReceiver.java文件
public class C2DMbroadcastReceiver extends broadcastReceiver { @Override public final void onReceive(Context context,Intent intent) { if (Constants.RECEIVED_REGISTRATION_ID_FROM_GOOGLE.equals(intent.getAction())) { Log.d(Constants.TAG,"Received a registration ID from Google."); intent.setAction(Constants.REGISTRATION_INTENT); intent.setClassName(context,RegistrationIDReceiver.class.getName()); } else if (Constants.RECEIVED_C2DM_MESSAGE_FROM_GOOGLE.equals(intent.getAction())) { Log.d(Constants.TAG,"Received a C2DM message from Google."); intent.setAction(Constants.START_C2DM_SERVICE); intent.setClass(context,C2DMService.class); } context.startService(intent); } }
//C2DMService.java文件
public class C2DMService extends Service { @Override public IBinder onBind(Intent intent) { Log.e(com.technosoft.Akashc2dm.Constants.TAG,"I was awakend by C2DM!"); return new Binder(); } }
//RegistrationException.java文件
public class RegistrationException extends Exception { private final String usedUrl; private final int responseCode; public RegistrationException(String message,String usedUrl,int responseCode) { super(message); this.usedUrl = usedUrl; this.responseCode = responseCode; } public RegistrationException(String message,Throwable cause) { super(message,cause); usedUrl = ""; responseCode = 0; } public RegistrationException(String message,IOException e) { super(message,e); this.usedUrl = usedUrl; responseCode = 0; } @Override public String getMessage() { return String.format("%s; URL: %s; Response code: %d",super.getMessage(),usedUrl,responseCode); } }
//RegistrationIDReceiver.java文件
public class RegistrationIDReceiver extends IntentService { notificationmanager nm; public static final String EXTRA_UNREGISTERED = "unregistered"; private final RegistrationIDRegistrar registrar = RegistrationIDRegistrar.getInstance(); private static final String EXTRA_ERROR = "error"; private static final String EXTRA_REGISTRATION_ID = "registration_id"; public RegistrationIDReceiver() { super(Constants.C2DM_APPLICATION_SERVER_ID); } @Override public final void onHandleIntent(Intent intent) { Bundle extras = intent.getExtras(); String message = (String)extras.get("message"); Log.d("Tag","msg:" + message); Log.d(Constants.TAG,"Received intent to register"); final String registrationId = intent.getStringExtra( EXTRA_REGISTRATION_ID); notifcation(registrationId); String error = intent.getStringExtra(EXTRA_ERROR); if (error == null) { registerDevice(registrationId); } else { handleRegistrationError(error); } } private void notifcation(String id) { nm = (notificationmanager) RegistrationIDReceiver.this.getSystemService(Context.NOTIFICATION_SERVICE); CharSequence from = "Please Testing for Recive id"; CharSequence message = "received ID"+id; Intent notifyintent = new Intent(getApplicationContext(),Akashc2dmActivity.class); PendingIntent contentIntent = PendingIntent.getActivity(getApplicationContext(),notifyintent,0); Notification notif = new Notification(R.drawable.ic_launcher,"Please take your Looking 4 Answers daily survey Now",System.currentTimeMillis()); notif.setLatestEventInfo(getApplicationContext(),from,message,contentIntent); nm.notify(1,notif); } private void registerDevice(String registrationId) { Log.d(Constants.TAG,"Will Now register device with ID: " + registrationId); try { registrar.registerIdWithC2DMService(registrationId); } catch (RegistrationException e) { Log.e(Constants.TAG,e.getMessage(),e); } } private void handleRegistrationError(String error) { Log.e(Constants.TAG,"Registration error " + error); Log.e(Constants.TAG,"Please click the registration button again to register the device."); } }
//RegistrationIDRegistrar.java文件
class RegistrationIDRegistrar { private static final String REGISTER_NEW_DEVICE = "register_device"; private static final String NODE_ID_ParaMETER = "nodeid"; private static final String REGISTRATION_IS_ParaMETER = "registrationid"; private final String url; static final String MASHMOBILE_C2DM_SERVER_URL = "http://10.0.1.3:8888"; private RegistrationIDRegistrar(String url) { this.url = url; } void registerIdWithC2DMService(final String registrationId) throws RegistrationException { DefaultHttpClient httpClient = new DefaultHttpClient(); String nodeId = "realNodeId"; final String requestUrl = createRegistrationUrl(registrationId,nodeId); HttpGet request = new HttpGet(requestUrl); try { HttpResponse response = httpClient.execute(request); int statusCode = response.getStatusLine().getStatusCode(); if (statusCode != 200) { throw new RegistrationException(String.format( "Could not register %s with the server.",registrationId),requestUrl,statusCode); } } catch (IOException e) { throw new RegistrationException(String.format( "Registration of %s Failed.",e); } } private String createRegistrationUrl(String registrationId,String nodeId) { return String.format("%s/%s?%s=%s&%s=%s",url,REGISTER_NEW_DEVICE,NODE_ID_ParaMETER,nodeId,REGISTRATION_IS_ParaMETER,registrationId); } static RegistrationIDRegistrar getInstance() { return new RegistrationIDRegistrar(MASHMOBILE_C2DM_SERVER_URL); } }
并最后使用清单文件
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.technosoft.Akashc2dm" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" /> <permission android:name="com.google.android.c2dm.permission.C2D_MESSAGE" android:protectionLevel="signature"/> <uses-permission android:name="com.google.android.c2dm.permission.C2D_MESSAGE"/> <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:name=".Akashc2dmActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <receiver android:name=".C2DMbroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND" > <intent-filter> <action android:name="com.google.android.c2dm.intent.REGISTRATION"/> <category android:name="com.technosoft.Akashc2dm"/> </intent-filter> <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE"/> <category android:name="com.technosoft.Akashc2dm"/> </intent-filter> </receiver> <service android:name=".RegistrationIDReceiver" > <intent-filter> <action android:name="com.technosoft.c2dm.intent.REGISTER"/> <category android:name="com.technosoft.Akashc2dm"/> </intent-filter> </service> <service android:name=".C2DMService"> <intent-filter> <action android:name="com.technosoft.c2dm.intent.START_SERVICE"/> <category android:name="com.technosoft.Akashc2dm"/> </intent-filter> </service> <Meta-data android:value="true" android:name="ADMOB_ALLOW_LOCATION_FOR_ADS"/> </application>
解决方法
上面的代码已成功运行.有一些变化
在C2DMbroadcastReceiver.java类中接收消息并且有
添加MessageClass.java类以将消息发送到服务器
在C2DMbroadcastReceiver.java类中接收消息并且有
添加MessageClass.java类以将消息发送到服务器
public class C2DMbroadcastReceiver extends broadcastReceiver { notificationmanager nm; @Override public final void onReceive(Context context,Intent intent) { if (Constants.RECEIVED_REGISTRATION_ID_FROM_GOOGLE.equals(intent.getAction())) { Log.d(Constants.TAG,RegistrationIDReceiver.class.getName()); } else if (Constants.RECEIVED_C2DM_MESSAGE_FROM_GOOGLE.equals(intent.getAction())) { Function_notification(context,intent); Log.d(Constants.TAG,C2DMService.class); } context.startService(intent); } private void Function_notification(Context context,Intent intent ) { Bundle extras = intent.getExtras(); Log.d("extras",""+extras); String message2 = (String)extras.get("collapse_key"); Log.d("collapse_key","collapse_key=" + message2); String message1 = (String)extras.get("payload"); Log.d("extras","payload=" + message1); String error = intent.getStringExtra("error"); Log.d("extras","error=" + error); nm = (notificationmanager) context.getSystemService(Context.NOTIFICATION_SERVICE); CharSequence from = "Please Testing for Recive message"; CharSequence message = message1; Intent notifyintent = new Intent(context,Akashc2dmActivity.class); PendingIntent contentIntent = PendingIntent.getActivity(context,0); Notification notif = new Notification(R.drawable.icon,"Please take your Recive message",System.currentTimeMillis()); notif.setLatestEventInfo(context,contentIntent); nm.notify(1,notif); } } > **Add This class in com.technosoft.C2dm_Server_1 package**
MessageClass .java文件
public class MessageClass { public static final String ParaM_REGISTRATION_ID = "registration_id"; public static final String ParaM_DELAY_WHILE_IDLE = "delay_while_idle"; public static final String ParaM_COLLAPSE_KEY = "collapse_key"; private static final String UTF8 = "UTF-8"; public static String sendMessage(String auth_token,String registrationId,String message) throws IOException { StringBuilder postDataBuilder = new StringBuilder(); postDataBuilder.append(ParaM_REGISTRATION_ID).append("=") .append(registrationId); postDataBuilder.append("&").append(ParaM_COLLAPSE_KEY).append("=") .append("1"); postDataBuilder.append("&").append("data.payload").append("=") .append(URLEncoder.encode("hello",UTF8)); byte[] postData = postDataBuilder.toString().getBytes(UTF8); // Hit the dm URL. URL url = new URL("https://android.clients.google.com/c2dm/send"); HttpsURLConnection .setDefaultHostnameVerifier(new CustomizedHostnameVerifier()); HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); conn.setDoOutput(true); conn.setUseCaches(false); conn.setRequestMethod("POST"); conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded;charset=UTF-8"); conn.setRequestProperty("Content-Length",Integer.toString(postData.length)); conn.setRequestProperty("Authorization","GoogleLogin auth=" + auth_token); OutputStream out = conn.getoutputStream(); out.write(postData); out.close(); int responseCode = conn.getResponseCode(); if (responseCode == 401 || responseCode == 403) { // The token is too old - return false to retry later,will // fetch the token // from DB. This happens if the password is changed or token // expires. Either admin // is updating the token,or Update-Client-Auth was received by // another server,// and next retry will get the good one from database. Log.d("C2DM","Unauthorized - need token"); } String updatedAuthToken = conn.getHeaderField("Update-Client-Auth"); if (updatedAuthToken != null && !auth_token.equals(updatedAuthToken)) { Log.d("C2DM","Got updated auth token from datamessaging servers: " + updatedAuthToken); sendMessage(updatedAuthToken,registrationId,message); } String responseLine = new BufferedReader(new InputStreamReader( conn.getInputStream())).readLine(); // NOTE: You *MUST* use exponential backoff if you receive a 503 // response code. // Since App Engine's task queue mechanism automatically does this // for tasks that // return non-success error codes,this is not explicitly // implemented here. // If we weren't using App Engine,we'd need to manually implement // this. if (responseLine == null || responseLine.equals("")) { Log.i("C2DM","Got " + responseCode + " response from Google AC2DM endpoint."); throw new IOException( "Got empty response from Google AC2DM endpoint."); } String[] responseParts = responseLine.split("=",2); if (responseParts.length != 2) { Log.e("C2DM","Invalid message from google: " + responseCode + " " + responseLine); throw new IOException("Invalid response from Google " + responseCode + " " + responseLine); } if (responseParts[0].equals("id")) { Log.i("Tag","Successfully sent data message to device: " + responseLine); } if (responseParts[0].equals("Error")) { String err = responseParts[1]; Log.w("C2DM","Got error response from Google datamessaging endpoint: " + err); // No retry. throw new IOException(err); } return responseLine; } private static class CustomizedHostnameVerifier implements HostnameVerifier { public boolean verify(String hostname,SSLSession session) { return true; } }
}
**This class use in RegistrationIDRegistrar.java class**
RegistrationIDRegistrar.java文件
class RegistrationIDRegistrar { static final String MASHMOBILE_C2DM_SERVER_URL = "http://10.0.1.3:8888"; String response; private RegistrationIDRegistrar(String url) { } void registerIdWithC2DMService(final String registrationId){ //getAuthentification(); Log.d("registrationId",""+registrationId); try { String auth_key =getToken(Constants.C2DM_APPLICATION_SERVER_ID,Constants.C2DM_APPLICATION_SERVER_Password); Log.d("auth_key",""+auth_key); response = MessageClass.sendMessage(auth_key,"hello test android"); Log.d("Response code",""+response); } catch (IOException e) { // Todo Auto-generated catch block e.printstacktrace(); } } public static String getToken(String email,String password) throws IOException { // Create the post data // Requires a field with the email and the password StringBuilder builder = new StringBuilder(); builder.append("Email=").append(email); builder.append("&Passwd=").append(password); builder.append("&accountType=GOOGLE"); builder.append("&source=MyLittleExample"); builder.append("&service=ac2dm"); // Setup the Http Post byte[] data = builder.toString().getBytes(); URL url = new URL("https://www.google.com/accounts/ClientLogin"); HttpURLConnection con = (HttpURLConnection) url.openConnection(); con.setUseCaches(false); con.setDoOutput(true); con.setRequestMethod("POST"); con.setRequestProperty("Content-Type","application/x-www-form-urlencoded"); con.setRequestProperty("Content-Length",Integer.toString(data.length)); // Issue the HTTP POST request OutputStream output = con.getoutputStream(); output.write(data); output.close(); // Read the response BufferedReader reader = new BufferedReader(new InputStreamReader( con.getInputStream())); String line = null; String auth_key = null; while ((line = reader.readLine()) != null) { if (line.startsWith("Auth=")) { auth_key = line.substring(5); Log.d("auth_key",""+auth_key); } } // Finally get the authentication token // To something useful with it return auth_key; } static RegistrationIDRegistrar getInstance() { return new RegistrationIDRegistrar(MASHMOBILE_C2DM_SERVER_URL); } }
原文地址:https://www.jb51.cc/android/309716.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。