2012-01-27 14 views
6

Identyfikator nadawcy jest używany w procesie rejestracji dla c2dm.but nie ma żadnych wiadomości odbierania ani żadnego identyfikatora rejestru.jak pobrać identyfikator rejestracji i wysłać wiadomość do aplikacji innej firmy w systemie android c2dm0 +

plików //Akashc2dmActivity.java

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, 0, new Intent(), 0)); 
    Log.d("app", ""+PendingIntent.getBroadcast(Akashc2dmActivity.this, 0, new Intent(), 0)); 
} 

@Override 
public void onClick(View v) { 
    if(v == Register){ 
     sendRequest(Register); 
    } 

} 

}

pliki // 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 = "[email protected]"; 
    private Constants() { 
    } 
} 

plik //C2DMBroadcastReceiver.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); 
    } 
} 

// Plik 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(); 
    } 
} 

pliki //RegistrationException.java

pliki
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, String usedUrl, 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

pliki
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(), 0,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.", registrationId), requestUrl, 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); 
    } 
} 

i przy ostatnim użyciu plik manifestu

<?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> 

proszę powiedz mi jak pobrać identyfikator zarejestrować i wysłać masaż na trzecie appication partii w C2DM

+0

, w jaki sposób jest to nie działa? Pomniejszy mógłby być mniejszy przykład. –

+0

01-27 18: 18: 01.653: D/Register (1151): hello 01-27 18: 18: 01.653: D/app (1151): PendingIntent {44eefeb8: [email protected]} 01- 27 18: 18: 01.913: W/ActivityManager (72): Odmowa zezwolenia: odbiór Intent {act = com.google.android.c2dm.intent.REGISTRATION cat = [com.technosoft.C2dm_Server_1] (ma dodatki)} do com. technosoft.C2dm_Server_1 wymaga com.technosoft.C2dm_Server_1.permission.C2D_MESSAGE z powodu nadawcy com.google.android.gsf (uid 10021) Ta odpowiedź przychodzi następnie sprawdź przycisk Żądaj .. prosze o pomoc, jak tylko –

Odpowiedz

6

Nie ma powyżej Code pracy successfully.There ma jakąś zmianę w klasie C2DMBroadcastReceiver.java dla odbierać wiadomości i tam ma dodać klasę MessageClass.java do wysyłania wiadomości do serwera

C2DMBroadcastReceiver.java złożyć

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, "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())) { 
      Function_notification(context,intent); 
      Log.d(Constants.TAG, "Received a C2DM message from Google."); 
      intent.setAction(Constants.START_C2DM_SERVICE); 
      intent.setClass(context, 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,notifyintent, 0); 
    Notification notif = new Notification(R.drawable.icon,"Please take your Recive message", System.currentTimeMillis()); 
    notif.setLatestEventInfo(context, from, message, contentIntent); 
    nm.notify(1, notif); 

    } 
} 



> **Add This class in com.technosoft.C2dm_Server_1 package** 

MessageClass .java file

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 plik

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,registrationId, "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); 
    } 
} 
2

C2DMBroadcastReceiver.java złożyć

if (Constants.RECEIVED_REGISTRATION_ID_FROM_GOOGLE.equals(intent.getAction())) { 
//here you can get registration id 
    final String registrationId = intent 
        .getStringExtra("registration_id"); 
/*your code*/ 
} 

a następnie wywołać metodę z RegistrationIDRegistrarregisterIdWithC2DMService(registrationId) klasa.

+0

@ Natalee Dzięki za przypomnienie .. . –

Powiązane problemy