Я пытаюсь сохранить некоторые фотографии с сервера. Я использовал некоторые части, которые я нашел, и он работал на эмуляторе (я использовал каталог для фотографий как Envinronment.getExternalStorageDirectory
). Теперь я попытался добавить приложение в свой телефон, и оно не будет работать. Когда я пытаюсь получить изображения из памяти, я получаю ошибку: E/BitmapFactory: Unable to decode stream: java.io.FileNotFoundException: /storage/emulated/0/PictogrameProbleme/20.png: open failed: ENOENT (No such file or directory)
, что означает, что фотографии не сохраняются там в первую очередь. Вот код, который я использую для сохранения и получения фотографий:
ПОСЛЕДНИЕ РЕДАКТИРОВАТЬ: После серьезного тестирования и отладки и так далее, я столкнулся с другой проблемой: Failed to create image decoder with message 'unimplemented'
РЕДАКТИРОВАТЬ: I также добавили необходимые permissions
в manifest
, плюс запрос их на runtime
.
РЕДАКТИРОВАТЬ: Я отредактировал код для сохранения на External memory
, но возникает та же ошибка. Я использовал logcat для получения LOCATIE
, откуда файл должен быть извлечен, а logcat
дает мне местоположение файла как: storage/emulated/0/...
public static String saveToSdCard(Bitmap bitmap, String filename) {
String stored = null;
File sdcard = Environment.getExternalStorageDirectory() ;
File folder = new File(sdcard.getAbsoluteFile(), "/PictogrameProbleme");//the dot makes this directory hidden to the user
folder.mkdir();
File file = new File(folder.getAbsoluteFile(), filename + ".png") ;
if (file.exists())
return stored ;
try {
FileOutputStream out = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.PNG, 90, out);
out.flush();
out.close();
stored = "success";
} catch (Exception e) {
e.printStackTrace();
}
return stored;
}
public static File getImage(String imagename) {
File mediaImage = null;
try {
String root = Environment.getExternalStorageDirectory().toString();
File myDir = new File(root);
if (!myDir.exists())
return null;
mediaImage = new File(myDir.getPath() + "/PictogrameProbleme/"+imagename);
Log.d("LOCATIE",myDir.getPath() + "/PictogrameProbleme/"+imagename );
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return mediaImage;
}
public static boolean checkifImageExists(String imagename)
{
Bitmap b = null ;
File file = ImageStorage.getImage(imagename+".png");
assert file != null;
String path = file.getAbsolutePath();
if (path != null)
b = BitmapFactory.decodeFile(path);
if(b == null || b.equals(""))
{
return false ;
}
return true ;
}
}
РЕДАКТИРОВАТЬ: I добавил код, который работает на эмуляторе, но не на телефоне.
РЕДАКТИРОВАТЬ: Добавлены разрешения. в onCreate
я вызываю функцию requestWritePermission()
.
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
if(requestCode == WRITE_PERMISSION){
if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {
Log.d(TAG, "Write Permission Failed");
Toast.makeText(this, "You must allow permission write external storage to your mobile device.", Toast.LENGTH_SHORT).show();
finish();
}
}
}
private void requestWritePermission(){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)!=PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},WRITE_PERMISSION);
}
}
}
Также в manifest
:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
РЕДАКТИРОВАТЬ: добавлен способ получения фотографий из URL
, возможно есть проблема.
private void SalveazaPictograme(final String url, final String imagename) {
class GetImage extends AsyncTask<Object, Object, Object> {
String requestUrl = url;
String imagename_ = imagename;
@Override
protected Object doInBackground(Object... objects) {
try {
URL url = new URL(requestUrl);
URLConnection conn = url.openConnection();
bitmap = BitmapFactory.decodeStream(conn.getInputStream());
} catch (Exception ex) {
}
return null;
}
@Override
protected void onPostExecute(Object o) {
if (!ImageStorage.checkifImageExists(imagename_)) {
ImageStorage.saveToSdCard(bitmap, imagename_);
Log.d("LALA","lalalallalaa");
}
}
}
GetImage au = new GetImage();
au.execute();
}
Я объявляю bitmap
в начале программы.