2014-12-05 142 views
0

我的项目在绘制& 30张图片我想保存/所有这些图像到SD卡复制点击一个按钮。我使用下面的代码将图像保存到SD卡,但我不想将此代码复制粘贴30次以保存所有图像。那么是否有更好的解决方案来解决这个问题。谢谢将多幅图片保存到SD卡

 Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.aurora); 
     String fileName = "aurora.png"; 

     File sd = Environment.getExternalStorageDirectory(); 
     File folder = new File(sd + "/Wallpaper Pack"); 
     folder.mkdir(); 

     File dest = new File(folder, fileName); 
     try { 
      FileOutputStream out; 
      out = new FileOutputStream(dest); 
      bitmap.compress(Bitmap.CompressFormat.PNG, 100, out); 
      out.flush(); 
      out.close(); 
     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

回答

2

它非常简单,创建一个数组并循环它。

int[] drawablesArr = {R.id.name1, R.id.name2, ....} 

for(int i=0l i<=drawablesArr.length; i++){ 
    Bitmap bitmap = BitmapFactory.decodeResource(getResources(), drawablesArr[i]); 
     String fileName = "image_"+ String.valueOf(i)+".png" ; 

     File sd = Environment.getExternalStorageDirectory(); 
     File folder = new File(sd + "/Wallpaper Pack"); 
     folder.mkdir(); 

     File dest = new File(folder, fileName); 
     try { 
      FileOutputStream out; 
      out = new FileOutputStream(dest); 
      bitmap.compress(Bitmap.CompressFormat.PNG, 100, out); 
      out.flush(); 
      out.close(); 
     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
} 
+1

你必须改变在每个迭代上的文件名。 – FWeigl 2014-12-05 17:04:39

+0

offcourse,那他可以做... – 2014-12-05 17:05:24

+0

@Murtaza Hussain谢谢你的代码。我尝试了你的代码,但只能保存一张图片,这要感谢Ascorbin指出必要的改变。现在它工作:)谢谢你们。是否有可能使用我自己的文件名而不是自动命名? – user2551070 2014-12-05 18:00:10

0

@Murtaza Hussain的答案是正确的,但最好从UI(主)线程运行这样的操作。所以,你可以使用ThreadPoolExecutor

// SaveThread.java 
public class SaveThread implements Runnable { 

    private int drawable; 
    private String fileName; 
    private Context context; 

    public SaveThread(Context context, int drawable, String fileName) { 
     this.drawable = drawable; 
     this.fileName = fileName; 
     this.context = context; 
    } 

    @override 
    public void run() { 
     Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), drawable); 

     File dest = new File(Environment.getExternalStorageDirectory(), "WallpaperPack/" + fileName); 
     dest.getParentFile().mkdirs(); 

     try { 
      FileOutputStream out = new FileOutputStream(dest); 
      bitmap.compress(CompressFormat.PNG, 100, out); 
      out.flush(); 
      out.close(); 
     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

} 
您的活动中

然后或其他组件:

int core = Runtime.getRuntime().availableProcessors(); 
ExecutorService executor = 
     new ThreadPoolExecutor(
       core + 1, 
       core * 2 + 1, 
       60l, 
       TimeUnit.SECONDS, 
       new LinkedBlockingQueue<Runnable>() 
       ); 

int[] drawables = {R.id.name1, R.id.name2, ....} 

for(int drawable : drawables) { 
    executor.execute(new SaveThread(getApplicationContext(), drawable, "image_"+ drawable +".png")); 
} 

executor.shutdown(); 
+0

由于我是新来的Android开发这真的很难,我理解你的代码,但无论如何,感谢代码:) – user2551070 2014-12-05 18:04:29

+0

@ user2551070 OK,但要小心,长期运行在UI线程操作可能会导致ANR例外,它在不同的设备中是不同的! – 2014-12-06 05:28:22

+0

我会尽力了解并希望在您的应用中应用您的方法。感谢您花时间编写代码片段:) – user2551070 2014-12-06 09:48:56