2012-10-27 24 views
1

我有這樣的例外:的Android GCM - 在客戶機上創建的通知時崩潰

java.lang.NoSuchMethodError: android.app.Notification$Builder.setProgress at android.support.v4.app.NotificationCompatIceCreamSandwich.a 
dd(NotificationCompatIceCreamSandwich.java:31) 
     at android.support.v4.app.NotificationCompat$NotificationCompatImplIceCreamSandwich.build(NotificationCompat.java:104) 
     at android.support.v4.app.NotificationCompat$Builder.build(NotificationCompat.java:558) 
     at com.problemio.GCMIntentService.generateNotification(GCMIntentService.java:132) 
     at com.problemio.GCMIntentService.onMessage(GCMIntentService.java:71) 
     at com.google.android.gcm.GCMBaseIntentService.onHandleIntent(GCMBaseIntentService.java:223) 
     at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:59) 
     at android.os.Handler.dispatchMessage(Handler.java:99) 
     at android.os.Looper.loop(Looper.java:132) 
     at android.os.HandlerThread.run(HandlerThread.java:60) 

這裏是我的GCMIntentService.java

package com.problemio; 

import static com.google.android.gcm.GCMConstants.ERROR_SERVICE_NOT_AVAILABLE; 
import static com.google.android.gcm.GCMConstants.EXTRA_ERROR; 
import static com.google.android.gcm.GCMConstants.EXTRA_REGISTRATION_ID; 
import static com.google.android.gcm.GCMConstants.EXTRA_SPECIAL_MESSAGE; 
import static com.google.android.gcm.GCMConstants.EXTRA_TOTAL_DELETED; 
import static com.google.android.gcm.GCMConstants.EXTRA_UNREGISTERED; 
import static com.google.android.gcm.GCMConstants.INTENT_FROM_GCM_LIBRARY_RETRY; 
import static com.google.android.gcm.GCMConstants.INTENT_FROM_GCM_MESSAGE; 
import static com.google.android.gcm.GCMConstants.INTENT_FROM_GCM_REGISTRATION_CALLBACK; 
import static com.google.android.gcm.GCMConstants.VALUE_DELETED_MESSAGES; 

import java.util.Random; 
import java.util.concurrent.TimeUnit; 
import com.google.android.gcm.GCMBaseIntentService; 

import android.app.AlarmManager; 
import android.app.IntentService; 
import android.app.Notification; 
import android.app.NotificationManager; 
import android.app.PendingIntent; 
import android.content.Context; 
import android.content.Intent; 
import android.graphics.Color; 
import android.media.RingtoneManager; 
import android.net.Uri; 
import android.os.Bundle; 
import android.os.PowerManager; 
import android.os.SystemClock; 
import android.support.v4.app.NotificationCompat; 
import android.util.Log; 
import android.widget.Toast; 

import utils.GCMConstants; 
import utils.SendEmail; 

public class GCMIntentService extends GCMBaseIntentService 
{ 
    public GCMIntentService() 
    { 
      super(ProblemioActivity.SENDER_ID); 
    } 

    @Override 
     protected void onRegistered(Context ctxt, String regId) { 
     Log.d(getClass().getSimpleName(), "onRegistered: " + regId); 
     Toast.makeText(this, regId, Toast.LENGTH_LONG).show(); 
     } 

     @Override 
     protected void onUnregistered(Context ctxt, String regId) { 
     Log.d(getClass().getSimpleName(), "onUnregistered: " + regId); 
     } 

     @Override 
     protected void onMessage(Context ctxt, Intent message) 
     { 
     Bundle extras=message.getExtras(); 

     for (String key : extras.keySet()) 
     { 
      //sendEmail("Key: " + key , "value: " + extras.getString(key)); 

      Log.d(getClass().getSimpleName(), 
       String.format("onMessage: %s=%s", key, 
           extras.getString(key))); 
     } 

     generateNotification(ctxt, extras.getString("message"), "New Message"); 
     } 

     // Subject , body 
     public void sendEmail(String subject , String body) 
     { 
      String[] params = new String[] { "http://www.problemio.com/problems/send_email_mobile.php", subject, body }; 

      SendEmail task = new SendEmail(); 
      task.execute(params);    
     }  

     @Override 
     protected void onError(Context ctxt, String errorMsg) { 
     Log.d(getClass().getSimpleName(), "onError: " + errorMsg); 
     } 

     @Override 
     protected boolean onRecoverableError(Context ctxt, String errorMsg) { 
     Log.d(getClass().getSimpleName(), "onRecoverableError: " + errorMsg); 

     return(true); 
     } 

     private static void generateNotification(Context context, String message, String title) 
     { 
      int icon = R.drawable.ic_launcher; 
      long when = System.currentTimeMillis(); // can change this to a future time if desired 

      NotificationManager notificationManager = 
        (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 

      Intent notificationIntent = new Intent(context, ProblemioActivity.class); 

      // set intent so it does not start a new activity 
      notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 
      PendingIntent intent = PendingIntent.getActivity(context, 0, notificationIntent, 0);   
      Uri defaultSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);    

      Notification notification = new NotificationCompat.Builder(context) 
      .setContentTitle(title) 
      .setContentText(message) 
      .setContentIntent(intent) 
      .setSmallIcon(icon) 
      .setLights(Color.YELLOW, 1, 2) 
      .setAutoCancel(true) 
      .setSound(defaultSound) 
      .build(); 

      notificationManager.notify(0, notification); 
    }  
} 

和崩潰發生在這條線:

generateNotification(ctxt, extras.getString("message"), "New Message"); 

我是不是應該用這樣的東西包裝那條線:

if (android.os.Build.VERSION.SDK_INT >= 8) 
{ 

} 

在我的清單我讓所有的SDK版本是這樣的:

回答

1

沒有申請這個支持庫錯誤,請here。固定的v4支持庫可以從this linkcomment #2下載。

+0

我應該把它放到try/catch語句中,這樣它不會使程序崩潰? – Genadinik

+0

做一個> =似乎排除太多的人,不是嗎? – Genadinik

+0

嘗試在bug報告頁面上基於[comment#5](http://code.google.com/p/android/issues/detail?id=36502#c5)構建固定支持庫jar。 –

0

這是在rev11之前的android-support-v4.jar中的一個已知錯誤。

要獲得最新的Android支持,v4.jar:

    從IDE
  1. 打開SDK管理器
  2. 檢查Android Support Library並點擊安裝軟件包
  3. 導航到yourSdkFolder/extras/android/support/v4和複製android-support-v4.jar
  4. 導航到您項目中android-support-v4.jar的位置,並粘貼,替換舊版本