2012-08-23 62 views
1

嘗試從我的應用程序服務器向GCM服務器發送消息時,出現java.lang.IllegalArgumentException異常。客戶端註冊成功。有java.lang.IllegalArgumentException異常嘗試發送gcm消息?

import java.util.ArrayList; 

import com.google.android.gcm.server.Message; 
import com.google.android.gcm.server.MulticastResult; 
import com.google.android.gcm.server.Sender; 

class Notify { 
    public static void main(String args[]) { 

     try { 

      Sender sender = new Sender(
        "AIzaSyCd9HdSlq51nLzoqxMaFLsxWaoxxIz6-bU"); 

      ArrayList<String> devicesList = new ArrayList<String>(); 
      devicesList.add("APA91bFzbdNTf5CVsnSpkPJxMTCUCnjruluaerQcONQq9f20aaHw1CMNcVFgBsnLd6gUQT5TxrV2WY5WBw9U9u4Paj3dAXgRbaATc9a2Gp0voF3h5elX3Be0r3xw3Kun2HZT1m3D8L6IwCkXtTiILIfVasiKd2uN3w"); 
      devicesList.add("APA91bFzbdNTf5CVsnSpkPJxMTCUCnjruluaerQcONQq9f20aaHw1CMNcVFgBsnLd6gUQT5TxrV2WY5WBw9U9u4Paj3dAXgRbaATc9a2Gp0voF3h5elX3Be0r3xw3Kun2HZT1m3D8L6IwCkXtTiILIfVasiKd2uN3w"); 

      // use this line to send message with payload data 
      Message message = new Message.Builder() 
        .collapseKey("1") 
        .timeToLive(3) 
        .delayWhileIdle(true) 
        .addData("message", 
          "this text will be seen in notification bar!!") 
        .build(); 

      // Use this for multicast messages 
      MulticastResult result = sender.send(message, devicesList, 1); 
      sender.send(message, devicesList, 1); 

      System.out.println(result.toString()); 
      if (result.getResults() != null) { 
       int canonicalRegId = result.getCanonicalIds(); 
       if (canonicalRegId != 0) { 
       } 
      } else { 
       int error = result.getFailure(); 
       System.out.println(error); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 
} 

是這樣的代碼

java.lang.IllegalArgumentException: argument cannot be null 
    at com.google.android.gcm.server.Sender.nonNull(Sender.java:553) 
    at com.google.android.gcm.server.Sender.getString(Sender.java:534) 
    at com.google.android.gcm.server.Sender.sendNoRetry(Sender.java:365) 
    at com.google.android.gcm.server.Sender.send(Sender.java:261) 
    at com.example.server.Notify.main(Notify.java:34) 

和多數民衆贊成我的問題,你AIzaSyCd9HdSlq51nLzoqxMaFLsxWaoxxIz6府的

回答

1

問題 - 用一個又一個。

+0

它沒有解決我的問題。 ı嘗試另一個apikey,但沒有改變仍然相同的錯誤。 –

+0

我把我的api密鑰放到了您的代碼中 - 以及它的作品。請再試一次(刷新幾次)。您在服務中打開Goog​​le Cloud Messaging for Android? – Yahor10

+0

感謝您的幫助:D –

1

閱讀迴應部分存在問題。它應該是這樣的:

MulticastResult multiResult = sender.send(message, devicesList, 1); 
List<Result> results = multiResult.getResults(); 

for (int i = 0; i < results.size(); i++) { 
    Result result = results.get(i); 

    if (result.getMessageId() != null) { 
     // Success 
     String canonicalRegId = result.getCanonicalRegistrationId(); 
     if (canonicalRegId != null) { 
      // same device has more than one registration id.Update it 
     } 
    } else { 
     // Error occurred 
     String error = result.getErrorCodeName(); 
    } 
} 
+0

ı試試這個,但沒有解決 –

+1

然後,似乎apiKey或設備ID有問題。你從哪裏獲得這些設備ID?這些應該在客戶端生成。還有,你爲什麼添加兩次相同的設備ID? –

1

GCM服務器返回一個錯誤,如「401 Unauthorized」,但是在GCM代碼中有一個錯誤,它引發這個IllegalArgumentException而不是預期的InvalidRequestException。您需要附加源代碼,然後在com.google.android.gcm.server.Sender的此代碼處設置斷點以查看實際的HTTP錯誤。

int status = conn.getResponseCode(); 
String responseBody; 
if (status != 200) { 
    responseBody = getString(conn.getErrorStream()); 
    logger.finest("JSON error response: " + responseBody); 
    throw new InvalidRequestException(status, responseBody); 
} 

基本上conn.getErrorStream()這裏返回null所以你永遠不會看到InvalidRequestException

以上代碼來自最新的1.0.2發行版。在最新的GCM GIT存儲庫https://code.google.com/p/gcm/issues/detail?id=7中有一個相關的修復,但看着他們對Sender所做的更改似乎仍然是一個問題。