Android Widget imageview位图错误

Android Widget imageview位图错误,android,widget,Android,Widget,在模拟器上工作完美,在电话崩溃上。。。!! 我检查了撞车的线路,但我不知道为什么!!请看代码 当我试图用填充的位图数组更新视图时,它会崩溃 public static final ArrayList<Bitmap> sms_rubrica = new ArrayList<Bitmap>(); public static Bitmap No_Foto = null; public void onUpdate(Context paramContext, A

在模拟器上工作完美,在电话崩溃上。。。!! 我检查了撞车的线路,但我不知道为什么!!请看代码 当我试图用填充的位图数组更新视图时,它会崩溃

public static final ArrayList<Bitmap>  sms_rubrica = new ArrayList<Bitmap>();
    public static Bitmap No_Foto = null;

    public void onUpdate(Context paramContext, AppWidgetManager appWidgetManager, 
            int[] appWidgetIds){

        ComponentName watchWidget;
        rview = new RemoteViews( paramContext.getPackageName(), R.layout.widget_layoutmain);
        watchWidget = new ComponentName( paramContext, Randomnuberwidget.class );

        Uri uriSMSURI = Uri.parse("content://sms/inbox");

        Cursor cur = paramContext.getContentResolver().query(uriSMSURI, null, null, null, "date desc limit 3");

         //Default photo

         No_Foto = BitmapFactory.decodeResource(paramContext.getResources(), R.drawable.no_photo); 




       while (cur.moveToNext()) {

            String address = cur.getString(cur.getColumnIndex("address"));
            String body = cur.getString(cur.getColumnIndexOrThrow("body"));
            String id;
            String date;
            int idColumn = cur.getColumnIndex("_id");
            int dateColumn = cur.getColumnIndex("date");

            id = cur.getString(idColumn);
            date = cur.getString(dateColumn);


      Date dateFromSms = new Date(Long.parseLong(date));

            Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(address));  
            Cursor cs= paramContext.getContentResolver().query(uri, new String[]{PhoneLookup.DISPLAY_NAME},PhoneLookup.NUMBER+"='"+address+"'",null,null);

            String idContact = fetchContactIdFromPhoneNumber(address, paramContext);

            //Add photo to array 
            if (idContact.compareTo("") != 0 )  {
                  Bitmap bit= loadContactPhoto(paramContext.getContentResolver(),Long.parseLong(idContact));
                  sms_rubrica.add(bit);
              }
             else  sms_rubrica.add(No_Foto);

            if(cs.getCount()>0)
            {
             cs.moveToFirst();
             address=cs.getString(cs.getColumnIndex(PhoneLookup.DISPLAY_NAME));
            }

            sms_num.add(address);
            sms_body.add(body);
            sms_id.add(id);
            sms_time.add(dateFromSms.toLocaleString());


       }


        Bitmap photo = sms_rubrica.get(0);

        rview.setTextViewText(R.id.Mittente,sms_num.get(0));
        rview.setTextViewText(R.id.TestoSms,  sms_body.get(0));
        rview.setTextViewText(R.id.Orario, sms_time.get(0));
            //Here's on telephone crash giving null pointer exception but not in the emulator
        rview.setImageViewBitmap(R.id.imgRubrica, photo);


      appWidgetManager.updateAppWidget( watchWidget, rview );
    }
以下是堆栈跟踪:

  02-06 01:11:44.289: E/AndroidRuntime(8624): FATAL EXCEPTION: main
  02-06 01:11:44.289: E/AndroidRuntime(8624): java.lang.RuntimeException: Unable to start receiver com.imrankhanandroid.HomeWidgetRandomNum.Randomnuberwidget: java.lang.NullPointerException
   02-06 01:11:44.289: E/AndroidRuntime(8624):  at android.app.ActivityThread.handleReceiver(ActivityThread.java:1809)
    02-06 01:11:44.289: E/AndroidRuntime(8624):     at android.app.ActivityThread.access$2400(ActivityThread.java:117)
   02-06 01:11:44.289: E/AndroidRuntime(8624):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:985)
   02-06 01:11:44.289: E/AndroidRuntime(8624):  at android.os.Handler.dispatchMessage(Handler.java:99)
    02-06 01:11:44.289: E/AndroidRuntime(8624):     at android.os.Looper.loop(Looper.java:130)
    02-06 01:11:44.289: E/AndroidRuntime(8624):     at android.app.ActivityThread.main(ActivityThread.java:3687)
      02-06 01:11:44.289: E/AndroidRuntime(8624):   at java.lang.reflect.Method.invokeNative(Native Method)
    02-06 01:11:44.289: E/AndroidRuntime(8624):     at java.lang.reflect.Method.invoke(Method.java:507)
    02-06 01:11:44.289: E/AndroidRuntime(8624):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
     02-06 01:11:44.289: E/AndroidRuntime(8624):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
    02-06 01:11:44.289: E/AndroidRuntime(8624):     at dalvik.system.NativeStart.main(Native Method)
    02-06 01:11:44.289: E/AndroidRuntime(8624): Caused by: java.lang.NullPointerException
    02-06 01:11:44.289: E/AndroidRuntime(8624):     at android.widget.RemoteViews$ReflectionAction.writeToParcel(RemoteViews.java:730)
     02-06 01:11:44.289: E/AndroidRuntime(8624):    at android.widget.RemoteViews.writeToParcel(RemoteViews.java:1376)
     02-06 01:11:44.289: E/AndroidRuntime(8624):    at com.android.internal.appwidget.IAppWidgetService$Stub$Proxy.updateAppWidgetProvider(IAppWidgetService.java:402)
    02-06 01:11:44.289: E/AndroidRuntime(8624):     at android.appwidget.AppWidgetManager.updateAppWidget(AppWidgetManager.java:283)
    02-06 01:11:44.289: E/AndroidRuntime(8624):     at com.imrankhanandroid.HomeWidgetRandomNum.Randomnuberwidget.onUpdate(Randomnuberwidget.java:167)
      02-06 01:11:44.289: E/AndroidRuntime(8624):   at android.appwidget.AppWidgetProvider.onReceive(AppWidgetProvider.java:61)
    02-06 01:11:44.289: E/AndroidRuntime(8624):     at com.imrankhanandroid.HomeWidgetRandomNum.Randomnuberwidget.onReceive(Randomnuberwidget.java:205)
     02-06 01:11:44.289: E/AndroidRuntime(8624):    at android.app.ActivityThread.handleReceiver(ActivityThread.java:1798)
     02-06 01:11:44.289: E/AndroidRuntime(8624):    ... 10 more

看起来您用于Randomnumberwidget的paramContext可能是导致NullPointerException的原因

从我对stacktrace的了解来看,问题似乎在这里: onUpdate(Randomnuberwidget.java:167)

尝试将getApplicationContext()传递到paramContext中。这意味着,无论参数来自何处,只要它转变为paramContext,就要确保它是getApplicationContext(),因为有时如果您使用的是不同的上下文发生了变化,就可以在那里得到一个空指针

已编辑

在使用位图之前,您可能还需要检查null。因此,如果位图为空,则使用默认位图

大概是这样的:

    Bitmap bit= loadContactPhoto(paramContext.getContentResolver(),Long.parseLong(idContact));
    if (idContact.compareTo("") != 0 && bit != null)  {
        sms_rubrica.add(bit);
    }

附加堆栈跟踪。这是自动生成方法,错误行标记在代码上。是,错误行在堆栈跟踪中。但是代码中没有包含行号。我必须在哪里传递GetApplicationContext()而不是paramContext?请检查代码rview.setImageViewBitmap(R.id.imgRubrica,照片);使用此指令(如上所述),它会崩溃并导致异常。如果没有此更新imageview的指令,应用程序不会崩溃“rview.setImageViewBitmap(R.id.imgRubrica,photo)的行号是多少;”呼叫
    Bitmap bit= loadContactPhoto(paramContext.getContentResolver(),Long.parseLong(idContact));
    if (idContact.compareTo("") != 0 && bit != null)  {
        sms_rubrica.add(bit);
    }