Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 挂载/卸载SD卡时,小部件将丢失其位图背景_Android_Bitmap_Android Widget_Widget_Sd Card - Fatal编程技术网

Android 挂载/卸载SD卡时,小部件将丢失其位图背景

Android 挂载/卸载SD卡时,小部件将丢失其位图背景,android,bitmap,android-widget,widget,sd-card,Android,Bitmap,Android Widget,Widget,Sd Card,我的应用程序是一个小部件,背景是imageView。 在WidgetProvider的onUpdate()方法中,我将sdcard中的位图放入此imageView中,调用此方法: public static void changeSkinWidget(Context context,String imageBackgroundPath) throws IOException{ RemoteViews views = new RemoteViews(context.getPackageN

我的应用程序是一个小部件,背景是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();
    } 

}
问题是,我总是挂载/卸载SD卡,小部件会丢失此位图,ImageView会获得布局声明中找到的defaut drawable(src=R.drawable.defaultbackground),而我的小部件似乎被重新加载。 为了跟踪这一点,我使用了onReceive()方法: Log.i(Constants.DEBUG_标记,“接收意图:”+INTENT.getAction()); 但logcat中没有显示任何内容…我可能希望有一个动作的意图\u APPWIDGET\u更新 行动,但什么也没有

我还尝试对位图调用recycle(),但这并不能解决问题

在安装/卸载logcat时,我没有看到任何奇怪的错误

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

解决方案是

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

谢谢您的回答。但这并不能解决问题,只是为了测试,我尝试将png写入内部存储,并从这个内部存储文件创建了一个新的位图……但问题在于:-(有什么想法吗?很抱歉。我会研究另一个解决方案。你使用的安卓版本是什么?它可能与我刚才添加的:bm=bm.copy有关吗(Bitmap.Config.ARGB_8888,true);就在views.setImageViewBitmap(R.id.ImageBackground01,bm)之前;它可以工作……非常感谢……浪费了8个小时!非常感谢迈克!