J'essaye de sauvegarder une image en utilisant l'API Picasso. Pour le faire, j'essaie d'utiliser Target
pour enregistrer mais je ne peux pas faire ce travail.
Comment pourrais-je faire ça?
En essayant
//save image
public static void imageDownload(Context ctx){
Picasso.with(ctx)
.load("http://blog.concretesolutions.com.br/wp-content/uploads/2015/04/Android1.png")
.into(getTarget("http://blog.concretesolutions.com.br/wp-content/uploads/2015/04/Android1.png"));
}
//target to save
private static Target getTarget(final String url){
Target target = new Target(){
@Override
public void onBitmapLoaded(final Bitmap bitmap, Picasso.LoadedFrom from) {
new Thread(new Runnable() {
@Override
public void run() {
//Log.i("PRODUTOS_FOLDER", CreateAppFolder.getProdutosFolder());
File file = new File(Environment.getExternalStorageDirectory() + url);
try {
file.createNewFile();
FileOutputStream ostream = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, ostream);
ostream.flush();
ostream.close();
}
catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
}
};
return target;
}
Exception
Java.io.IOException: open failed: ENOENT (No such file or directory)
Résolu. fonctionne maintenant bien!
J'ai fait
//save image
public static void imageDownload(Context ctx, String url){
Picasso.with(ctx)
.load("http://blog.concretesolutions.com.br/wp-content/uploads/2015/04/Android1.png")
.into(getTarget(url));
}
//target to save
private static Target getTarget(final String url){
Target target = new Target(){
@Override
public void onBitmapLoaded(final Bitmap bitmap, Picasso.LoadedFrom from) {
new Thread(new Runnable() {
@Override
public void run() {
File file = new File(Environment.getExternalStorageDirectory().getPath() + "/" + url);
try {
file.createNewFile();
FileOutputStream ostream = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.JPEG, 80, ostream);
ostream.flush();
ostream.close();
} catch (IOException e) {
Log.e("IOException", e.getLocalizedMessage());
}
}
}).start();
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
}
};
return target;
}
Je peux voir 2 problèmes possibles:
J'ai modifié la solution en ajoutant des autorisations et un bouton pour charger et enregistrer l'image et la classe PhotoLoader reste la même!
private static final String[] STORAGE_PERMISSIONS = { Manifest.permission.WRITE_EXTERNAL_STORAGE};
ImageView imageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = (ImageView) findViewById(R.id.imageView);
verifyPermissions();
}
public void save(View view)
{
Picasso.with(this)
.load("https://www.w3schools.com/howto/img_fjords.jpg")
.into(new PhotoLoader("myImg.jpg" , imageView));
}
public void verifyPermissions()
{
// This will return the current Status
int permissionExternalMemory = ActivityCompat.checkSelfPermission(MainActivity.this,Manifest.permission.WRITE_EXTERNAL_STORAGE);
if(permissionExternalMemory != PackageManager.PERMISSION_GRANTED)
{
// If permission not granted then ask for permission real time.
ActivityCompat.requestPermissions(MainActivity.this,STORAGE_PERMISSIONS,1);
}
}
Je pense que vous devez vérifier si vous demandez réellement l'autorisation . Sous Android, les autorisations sont dynamiques à partir de la version 6.0. Vous devez le demander au moment de l'exécution ou simplement rétrograder votre version de targetSdk à 22.