2012-04-13 9 views
0

Ich erstelle ein Android-Spiel, das über JSON mit einem Webserver kommuniziert. Wenn jemand ein neues Spiel gegen einen anderen Benutzer startet, möchte ich, dass dieser Benutzer sofort eine Benachrichtigung erhält. Bisher habe ich die Benachrichtigungen gemacht und sie funktionieren, aber es prüft nur, wenn ich mich im Spiel anmelde, wie erstelle ich ein Live-Update , das mit einem, vielleicht, eine Minute Intervall überprüft, selbst wenn das Spiel geschlossen ist?Android-Live-Update?


c2dm.php

<? 

function googleAuthenticate($username, $password, $source="Company-AppName-Version", $service="ac2dm") { 


    session_start(); 
    if(isset($_SESSION['google_auth_id']) && $_SESSION['google_auth_id'] != null) 
     return $_SESSION['google_auth_id']; 

    // get an authorization token 
    $ch = curl_init(); 
    if(!ch){ 
     return false; 
    } 

    curl_setopt($ch, CURLOPT_URL, "https://www.google.com/accounts/ClientLogin"); 
    $post_fields = "accountType=" . urlencode('HOSTED_OR_GOOGLE') 
     . "&Email=" . urlencode($username) 
     . "&Passwd=" . urlencode($password) 
     . "&source=" . urlencode($source) 
     . "&service=" . urlencode($service); 
    curl_setopt($ch, CURLOPT_HEADER, true); 
    curl_setopt($ch, CURLOPT_POST, true); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_FRESH_CONNECT, true); 
    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 

    // for debugging the request 
    //curl_setopt($ch, CURLINFO_HEADER_OUT, true); // for debugging the request 

    $response = curl_exec($ch); 

    //var_dump(curl_getinfo($ch)); //for debugging the request 
    //var_dump($response); 

    curl_close($ch); 

    if (strpos($response, '200 OK') === false) { 
     return false; 
    } 

    // find the auth code 
    preg_match("/(Auth=)([\w|-]+)/", $response, $matches); 

    if (!$matches[2]) { 
     return false; 
    } 

    $_SESSION['google_auth_id'] = $matches[2]; 
} 


function sendMessageToPhone($authCode, $deviceRegistrationId, $msgType, $messageText) { 

    $headers = array('Authorization: GoogleLogin auth=' . $authCode); 
    $data = array(
     'registration_id' => $deviceRegistrationId, 
     'collapse_key' => $msgType, 
     'data.message' => $messageText //TODO Add more params with just simple data instead   
    ); 

    $ch = curl_init(); 

    curl_setopt($ch, CURLOPT_URL, "https://android.apis.google.com/c2dm/send"); 
    if ($headers) 
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
    curl_setopt($ch, CURLOPT_POST, true); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data); 


    $response = curl_exec($ch); 

    curl_close($ch); 

    return $response; 
} 
?> 

C2DMRegistrationReceiver

public class C2DMRegistrationReceiver extends BroadcastReceiver 
{ 

@Override 
public void onReceive(Context context, Intent intent) { 
    String action = intent.getAction(); 
    Log.w("C2DM", "Registration Receiver called"); 
    if ("com.google.android.c2dm.intent.REGISTRATION".equals(action)) { 
     Log.w("C2DM", "Received registration ID"); 
     final String registrationId = intent 
       .getStringExtra("registration_id"); 
     String error = intent.getStringExtra("error"); 

     Log.d("C2DM", "dmControl: registrationId = " + registrationId 
       + ", error = " + error); 
     // TODO Send this to my application server 
    } 
} 

public void sendRegistrationIdToServer(String deviceId, String registrationId) { 

    Log.d("C2DM", "Sending registration ID to my application server"); 
    HttpClient client = new DefaultHttpClient(); 
    HttpPost post = new HttpPost("myserverpage"); 
    try { 
     List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1); 
     // Get the deviceID 
     nameValuePairs.add(new BasicNameValuePair("deviceid", deviceId)); 
     nameValuePairs.add(new BasicNameValuePair("registrationid", registrationId)); 

     post.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
     HttpResponse response = client.execute(post); 
     BufferedReader rd = 
      new BufferedReader(new InputStreamReader(response.getEntity().getContent())); 
     String line = ""; 
     while ((line = rd.readLine()) != null) { 
      Log.e("HttpResponse", line); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
} 

C2DMMessageReceiver

public class C2DMMessageReceiver extends BroadcastReceiver { 

@Override 
public void onReceive(Context context, Intent intent) { 
    String action = intent.getAction(); 
    Log.w("C2DM", "Message Receiver called"); 
    if ("com.google.android.c2dm.intent.RECEIVE".equals(action)) { 
     Log.w("C2DM", "Received message"); 
     final String payload = intent.getStringExtra("payload"); 
     Log.d("C2DM", "dmControl: payload = " + payload); 
     // Send this to my application server 
    } 
} 
} 

public void register(View view) { 
    Intent intent = new Intent("com.google.android.c2dm.intent.REGISTER"); 
    intent.putExtra("app",PendingIntent.getBroadcast(this, 0, new Intent(), 0)); 
    intent.putExtra("sender", "[email protected]"); 
    startService(intent); 
} 

Nun, wenn ich ein Spiel gegen jemanden zu starten, habe ich eine Klasse, die die Informatio sendet n zum Server. Wie gehe ich dann vor?

Antwort

0

Sie könnten erreichen, was Sie wollen, indem Sie eine Service implementieren. Wenn Sie jedoch eine HTTP-Anforderung stellen, um den Status jede Minute zu erhalten, wird die Batterie verbraucht. Ich würde vorschlagen, in C2DM zu suchen, um eine Push-Benachrichtigung an den Client zu senden.

+0

Okey Ich werde es nachschlagen, danke! – simtaxman

+0

Sie kennen ein gutes Tutorial oder etwas? Weil ich sowohl auf der Serverseite als auch auf der Geräteseite wissen muss. Außerdem programmiere ich den Server in PHP. – simtaxman

+0

Ein guter (der im Moment anscheinend nicht verfügbar ist) ist hier: http://www.vogella.de/articles/AndroidCloudToDeviceMessaging/article.html#c2dm_sendmessage. Die Serverseite wird in Java angezeigt, Sie müssen sie also nach PHP portieren. Bis die Website wieder verfügbar ist, können Sie die zwischengespeicherte Version hier anzeigen: http://webcache.googleusercontent.com/search?q=cache:zrU0h--nBpIJ:www.vogella.de/articles/AndroidCloudToDeviceMessaging/article.html+ & cd = 1 & hl = de & ct = clnk & gl = uns – elevine