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;
}
例外
Java.io.IOException: open failed: ENOENT (No such file or directory)
解決しました。今うまく動作します!
やった
//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つの問題を確認できます。
これに対する解決策を修正し、パーミッションを追加し、画像をロードして保存するbuttonを追加し、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);
}
}
実際に許可を要求しているかどうかを確認する必要があると思います。 In Androidバージョン6.0以降、権限は動的です。実行時にリクエストするか、targetSdkバージョンを22にダウングレードする必要があります。