2010-12-22 79 views
1

我試圖將res/raw或assets文件夾中的圖像(jpg或png)保存到SD卡位置(/ sdcard/DCIM /)。Android Dev Help:將Res/raw或Asset文件夾中的圖像保存到SD卡

我一直在關注一個教程,該教程可以將URL中的圖像保存到SD卡根目錄,但我已到處尋找能夠從res/raw或資源文件夾中保存而不是在sd上的不同位置卡/ SD卡/ DCIM/

這是代碼,任何人都可以告訴我如何從上面做到這一點?

public class home extends Activity { 
    private File file; 
    private String imgNumber; 
    private Button btnDownload; 
    /** Called when the activity is first created. */ 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.main); 
     btnDownload=(Button)findViewById(R.id.btnDownload); 

     btnDownload.setOnClickListener(new OnClickListener() { 

    public void onClick(View v) { 
     btnDownload.setText("Download is in Progress."); 
     String savedFilePath=Download("http://www.domain.com/android1.png"); 
     Toast.makeText(getApplicationContext(), "File is Saved in "+savedFilePath, 1000).show(); 
     if(savedFilePath!=null) 
     { 
     btnDownload.setText("Download Completed."); 
     } 
    } 
    }); 

    } 
    public String Download(String Url) 
    { 
    String filepath=null; 
    try { 
    //set the download URL, a url that points to a file on the internet 
    //this is the file to be downloaded 
    URL url = new URL(Url); 
    //create the new connection 
    HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 

    //set up some things on the connection 
    urlConnection.setRequestMethod("GET"); 
    urlConnection.setDoOutput(true); 
    //and connect! 
    urlConnection.connect(); 
    //set the path where we want to save the file 
    //in this case, going to save it on the root directory of the 
    //sd card. 
    File SDCardRoot = Environment.getExternalStorageDirectory(); 
    //create a new file, specifying the path, and the filename 
    //which we want to save the file as. 

    String filename= "download_"+System.currentTimeMillis()+".png"; // you can download to any type of file ex:.jpeg (image) ,.txt(text file),.mp3 (audio file) 
    Log.i("Local filename:",""+filename); 
    file = new File(SDCardRoot,filename); 
    if(file.createNewFile()) 
    { 
    file.createNewFile(); 
    } 

    //this will be used to write the downloaded data into the file we created 
    FileOutputStream fileOutput = new FileOutputStream(file); 

    //this will be used in reading the data from the internet 
    InputStream inputStream = urlConnection.getInputStream(); 

    //this is the total size of the file 
    int totalSize = urlConnection.getContentLength(); 
    //variable to store total downloaded bytes 
    int downloadedSize = 0; 

    //create a buffer... 
    byte[] buffer = new byte[1024]; 
    int bufferLength = 0; //used to store a temporary size of the buffer 

    //now, read through the input buffer and write the contents to the file 
    while ((bufferLength = inputStream.read(buffer)) > 0) { 
    //add the data in the buffer to the file in the file output stream (the file on the sd card 
    fileOutput.write(buffer, 0, bufferLength); 
    //add up the size so we know how much is downloaded 
    downloadedSize += bufferLength; 
    //this is where you would do something to report the prgress, like this maybe 
    Log.i("Progress:","downloadedSize:"+downloadedSize+"totalSize:"+ totalSize) ; 
    btnDownload.setText("download Status:"+downloadedSize+"/"+totalSize); 
    } 
    //close the output stream when done 
    fileOutput.close(); 
    if(downloadedSize==totalSize) filepath=file.getPath(); 

    //catch some possible errors... 
    } catch (MalformedURLException e) { 
    e.printStackTrace(); 
    } catch (IOException e) { 
    filepath=null; 

    btnDownload.setText("Internet Connection Failed.\n"+e.getMessage()); 
    e.printStackTrace(); 
    } 
    Log.i("filepath:"," "+filepath) ; 
    return filepath; 

    } 

} 

回答

2

測試和工作代碼:

爲了複製從資源(image1.png)在SD卡上的圖片目錄(image1.jpg)的圖像文件的圖像,你可以試試下面的辦法(需要android.permission.WRITE_EXTERNAL_STORAGE才能將圖像保存到SD卡上)。已將ACTION_MEDIA_SCANNER_SCAN_FILE廣播發送出去,以便將新圖片傳遞給媒體掃描器,以便在Media Gallery ASAP中可見。

import java.io.ByteArrayOutputStream; 
import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.OutputStream; 
import android.net.Uri; 
import android.app.Activity; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.widget.Button; 
import android.os.Bundle; 
import android.os.Environment; 
import android.view.View 

public class MainScreen extends Activity 
{ 
    private Button btnDownload; 
    /** Called when the activity is first created. */ 
    @Override  
    public void onCreate(Bundle savedInstanceState) 
    {   
     super.onCreate(savedInstanceState);   
     setContentView(R.layout.main);  
     btnDownload=(Button)findViewById(R.id.SaveButton1); 

     btnDownload.setOnClickListener(
      new Button.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        String newPicture = saveToSDCard(R.drawable.image1, "image1.jpg"); 
        startMediaScanner(newPicture); 
       } 
      } 
     ); 
    } 

    private String saveToSDCard(int resourceID, String finalName) 
    { 
     StringBuffer createdFile = new StringBuffer(); 

     Bitmap resourceImage = BitmapFactory.decodeResource(this.getResources(), resourceID);  
     File externalStorageFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), finalName); 
     ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
     resourceImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes); 
     byte b[] = bytes.toByteArray(); 

     try 
     { 
      externalStorageFile.createNewFile(); 
      OutputStream filoutputStream = new FileOutputStream(externalStorageFile); 
      filoutputStream.write(b); 
      filoutputStream.flush(); 
      filoutputStream.close(); 
      createdFile.append(externalStorageFile.getAbsolutePath()); 
     } 
     catch (IOException e) 
     { 
     } 

     return createdFile.toString(); 
    } 

    private void startMediaScanner(String addedPicture) 
    { 
     sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://"+ addedPicture))); 
    } 
} 
+0

嗨Zelimir,感謝你爲這個,我覺得我幾乎沒有,我只是在日食1級的錯誤,那就是DIRECTORY_PICTURES爲紅色,並且錯誤對話框說「DIRECTORY_PICTURES不能解決或不是一個領域「我如何解決這個問題? – Lucy 2010-12-23 10:36:31

2
InputStream is = context.getAssets().open(fileName); 
OutputStream os = new FileOutputStream(Environment.getExternalStorageDirectory() + File.separator + fileName); 

BufferedInputStream bis = new BufferedInputStream(is); 
BufferedOutputStream bos = new BufferedOutputStream(os); 
byte[] buf = new byte[1024]; 

int n = 0; 
int o = 0; 
while ((n = bis.read(buf, o, buf.length)) != 0) { 
    bos.write(buf, 0, n); 
} 

bis.close(); 
bos.close();