Сохранение изображения из URL с помощью Picasso?
Я пытаюсь сохранить изображение, используя API Picasso. Для этого я пытаюсь использовать Target
для сохранения, но я не могу выполнить эту работу.
Как я могу это сделать?
Попытка
//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)
Ответы
Ответ 1
решаемая. теперь отлично работает!
Я сделал
//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;
}
Ответ 2
Я вижу две возможные проблемы:
- пытается сохранить на внешнем хранилище без разрешения на запись в вашем манифесте
- попробуйте изменить имя файла, чтобы его не весь URL-адрес, который может быть вашей проблемой из-за символов вашего URL-адреса, которые являются действительными как символы имени файла.
Ответ 3
Я изменил решение этой проблемы, добавив разрешения и кнопку для загрузки и сохранения изображения, и класс PhotoLoader остался прежним!
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);
}
}
Ответ 4
Я думаю, вам нужно проверить, действительно ли вы запрашиваете разрешение.
В Android разрешения являются динамическими, начиная с версии 6.0. Либо вы должны запросить его во время выполнения, либо просто понизить версию targetSdk до 22.
Ответ 5
Отправить URL-адрес метода,
public void downloadFile(String url) {
DownloadManager mgr = (DownloadManager)
getSystemService(Context.DOWNLOAD_SERVICE);
Uri downloadUri = Uri.parse(url);
DownloadManager.Request request = new DownloadManager.Request(downloadUri);
request.setAllowedNetworkTypes(
DownloadManager.Request.NETWORK_WIFI
| DownloadManager.Request.NETWORK_MOBILE)
.setAllowedOverRoaming(false).setTitle("Demo")
.setDescription("Something useful. No, really.")
.setDestinationInExternalPublicDir("/LoverBoyTARUN",String.valueOf(System.currentTimeMillis())+".jpg");
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); //Notify client once download is completed!
Toast.makeText(getApplicationContext(), "Downloading..." , Toast.LENGTH_SHORT).show();
mgr.enqueue(request);
}