Я создал отдельный проект и действие, которое загружает изображение из 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 происходит что-то странное. Но никаких исключений не выдается.
Большое спасибо за вашу помощь!