Android Dev Help: Сохранение изображения из папки Res / raw или Asset на SD-карту

1

Я пытаюсь сохранить изображение (jpg или png) из папки res/raw или assets в папку SD-карты (/sdcard/DCIM/).

Я слежу за учебником, который может сохранить изображение с URL-адреса на SD-карте Root, но я повсюду выглядел, чтобы иметь возможность сохранять из папки res/raw или asset, а также в другое место на карте sd/SDCard/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 ответа

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();
2

Протестированный и рабочий код:

Чтобы скопировать изображение из ресурсов (image1.png) в файл изображения в каталоге Pictures (image1.jpg) на SD-карте, вы можете попробовать следующий подход (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
    Привет Зелимир, спасибо тебе за это, я чувствую, что я почти на месте, у меня просто 1 ошибка в затмении, то есть DIRECTORY_PICTURES красного цвета, а в окне с ошибкой указано «DIRECTORY_PICTURES не может быть разрешено или не является полем». Как сделать я разрешаю это?
  • 0
    Привет, Решил проблему DIRECTORY_PICTURES, но как мне сообщить системе, что был добавлен новый файл, чтобы пользователь мог сразу же просмотреть его в своей галерее изображений, я считаю, что это связано с MediaScanner, как это реализовано в коде? Большое спасибо уже. Люси
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню