Не удается загрузить изображение на SD-карту в службе (Android) - PullRequest
2 голосов
/ 08 октября 2010

Я создал отдельный проект и действие, которое загружает изображение из URL-адреса, преобразует его в растровое изображение и затем использует FileOutputStream для сохранения этого файла на SD-карту. Когда в отдельном проекте и отдельно стоящем действии это работало нормально, и я мог видеть, что изображение хранится на SD-карте.

public class PictureDownload extends Activity {

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        downloadFromUrl("http://www.coutblog.com/prism/uploads/0030.jpg", "newpic.jpg");
        displayPic("newpic.jpg");
    }

    // Place to download the file
    private final String PATH = "/sdcard/";

    public void displayPic(String filename) {
        ImageView image = (ImageView)findViewById(R.id.image);
        Bitmap bMap = BitmapFactory.decodeFile(PATH + filename);
        image.setImageBitmap(bMap);
    }

    /**
     * Downloads the picture from the URL to the SD card
     * @param imageURL: the URL to download it from (absolute web URL)
     * @param fileName: the name of the file you want to save the picture to
     */
    public void downloadFromUrl(String imageURL, String fileName) {
        try {
                // Connect to the URL
                URL myImageURL = new URL(imageURL);
                HttpURLConnection connection = (HttpURLConnection)myImageURL.openConnection();
                connection.setDoInput(true);
                connection.connect();
                InputStream input = connection.getInputStream();

                // Get the bitmap
                Bitmap myBitmap = BitmapFactory.decodeStream(input);

                // Save the bitmap to the file
                String path = Environment.getExternalStorageDirectory().toString();
                OutputStream fOut = null;
                File file = new File(path, fileName);
                fOut = new FileOutputStream(file);

                myBitmap.compress(Bitmap.CompressFormat.JPEG, 85, fOut);
                fOut.flush();
                fOut.close();
            } catch (IOException e) {}
    }

}

Но всякий раз, когда я пытался перенести код в существующий проект, он терпел неудачу. В этой настройке я запускаю код из службы. Код точно такой же, но по какой-то причине он не загружает никаких файлов. Связано ли это с тем, что он работает на службе вместо активности? Или, возможно, по какой-то причине выходной поток файла испортился.

В BGService:

String name = remote_resource.getValue().substring(38);
                downloadFromUrl(remote_resource.getValue(), name);
 /**
 * Downloads the picture from the URL to the SD card
 * @param imageURL: the URL to download it from (absolute web URL)
 * @param fileName: the name of the file you want to save the picture to
 */
public void downloadFromUrl(String imageURL, String fileName) {
    try {
            // Connect to the URL
            URL myImageURL = new URL(imageURL);
            HttpURLConnection connection = (HttpURLConnection)myImageURL.openConnection();
            connection.setDoInput(true);
            connection.connect();
            InputStream input = connection.getInputStream();

            // Get the bitmap
            Bitmap myBitmap = BitmapFactory.decodeStream(input);

            // Save the bitmap to the file
            String path = Environment.getExternalStorageDirectory().toString();

            OutputStream fOut = null;
            File file = new File(path, fileName);
            Log.i("help", file.getAbsolutePath());
            Log.i("help", file.toString());
            Log.i("help", file.length() + "");
            System.out.println("THIS IS A TEST OF SYSTEM.OUT.PRINTLN()");
            fOut = new FileOutputStream(file);

            myBitmap.compress(Bitmap.CompressFormat.JPEG, 85, fOut);
            fOut.flush();
            fOut.close();
            System.out.println("file Path: " + file.getAbsolutePath());
            Log.i("help2", file.getAbsolutePath());
            Log.i("help2", file.toString());
            Log.i("help2", file.length() + "");

        } catch (IOException e) {}
}

Еще одна интересная вещь - это то, что из вызовов «Log.i» ниже, только второй (ниже fOut.flush ()) печатается. Так что где-то в растровом сжатии или FileOutputStream IO происходит что-то странное. Но никаких исключений не выдается.

Большое спасибо за вашу помощь!

Ответы [ 2 ]

1 голос
/ 15 октября 2010

Вы действительно уверены, что WRITE_EXTERNAL_STORAGE включен? Если вы используете license-group.STORAGE, он не всегда включает это туда.

0 голосов
/ 22 августа 2011

Я сделал новый проект с вашим кодом и работает нормально!

Я включил в свой AndroidManifest.xml это:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
...