【问题标题】:Widget loses its bitmap background when SD-card is mounted / unmounted挂载/卸载 SD 卡时,小部件失去其位图背景
【发布时间】:2011-05-02 10:12:36
【问题描述】:

我的应用是一个小部件,它的背景是一个 imageView。 在 WidgetProvider 的 onUpdate() 方法中,我将来自 sdcard 的位图放入这个 imageView 中调用这个方法:

public static void changeSkinWidget(Context context,String imageBackgroundPath) throws IOException{
     RemoteViews views = new RemoteViews(context.getPackageName(),R.layout.widget);
     BitmapFactory.Options options = new BitmapFactory.Options();
     options.inSampleSize = 2;

     Log.i(Constants.DebugTag,"changeSkinWidget receive new path " +imageBackgroundPath);

     //Change Background Skin :
     FileInputStream is;
    try {
        is = new FileInputStream(new File(imageBackgroundPath
                + "background.png"));
        BufferedInputStream bis = new BufferedInputStream(is);
        Bitmap bm = BitmapFactory.decodeStream(is);
        views.setImageViewBitmap(R.id.ImageBackground01, bm);
        ComponentName thisWidget = new ComponentName(context,
                MyWidget.class);
        AppWidgetManager manager = AppWidgetManager.getInstance(context);
        manager.updateAppWidget(thisWidget, views);     
        bis.close();
        is.close();

    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } 

}

问题是我总是挂载/卸载 SDCARD,小部件丢失了这个位图,并且 ImageView 获得了在布局声明 (src=R.drawable.defaultbackground) 中找到的默认可绘制对象,并且似乎我的小部件已重新加载。 为了跟踪这一点,我使用了 onReceive() 方法: Log.i(Constants.DEBUG_TAG,"接收意图:"+intent.getAction()); 但是logcat中什么都没有出现......我预计可能是ACTION_APPWIDGET_UPDATE的意图 行动,但什么都没有。

我也曾尝试将 recycle() 调用到我的位图...这并不能解决问题。

在挂载/卸载时查看 logcat 没有任何奇怪的错误...

任何帮助将不胜感激! 克里斯托夫。

【问题讨论】:

    标签: android bitmap android-widget widget sd-card


    【解决方案1】:

    解决方案是here

    与实际解决方案无关的其他注释... 与永远不应该将小部件移动到 SD 卡的方式类似,小部件也不应该引用 SD 卡上的资源。小部件可以经常重新加载,它们需要访问该资源。一种可能的解决方案是将图像文件存储在本地文件系统的 widgets /data 目录中。

    【讨论】:

    • 感谢您的回答。但这并没有解决问题,只是为了测试我试图将我的 png 写入内部存储,并从这个内部存储文件创建了一个新的位图....但问题就在这里 :-( 有什么想法吗?
    • 很抱歉。我会研究另一种解决方案。你用的是什么版本的安卓?是否可能与code.google.com/p/android/issues/detail?id=8489有关?
    • 我刚刚添加了:bm = bm.copy(Bitmap.Config.ARGB_8888, true);就在 views.setImageViewBitmap(R.id.ImageBackground01, bm); 之前它有效....非常感谢您....浪费了8个小时!非常感谢迈克!
    猜你喜欢
    • 2011-10-21
    • 1970-01-01
    • 2017-07-12
    • 2012-07-07
    • 2011-09-28
    • 1970-01-01
    • 1970-01-01
    • 2012-03-12
    • 1970-01-01
    相关资源
    最近更新 更多