public class RxMeizhi {
public static Observable<Uri> saveImageAndGetPathObservable(Context context, String url, String title) {
return Observable.create(new Observable.OnSubscribe<Bitmap>() {
@Override public void call(Subscriber<? super Bitmap> subscriber) {
Bitmap bitmap = null;
try {
bitmap = Picasso.with(context).load(url).get();
} catch (IOException e) {
subscriber.onError(e);
}
if (bitmap == null) {
subscriber.onError(new Exception("無法下載到圖片"));
}
subscriber.onNext(bitmap);
subscriber.onCompleted();
}
}).flatMap(new Func1<Bitmap, Observable<? extends Uri>>() {
@Override
public Observable<? extends Uri> call(Bitmap bitmap) {
File appDir = new File(Environment.getExternalStorageDirectory(), "Meizhi");
if (!appDir.exists()) {
appDir.mkdir();
}
String fileName = title.replace('/', '-') + ".jpg";
File file = new File(appDir, fileName);
try {
FileOutputStream outputStream = new FileOutputStream(file);
assert bitmap != null;
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);
outputStream.flush();
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
Uri uri = Uri.fromFile(file);
Intent scannerIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri);
context.sendBroadcast(scannerIntent);
return Observable.just(uri);
}
}).subscribeOn(Schedulers.io());
}
}
private void saveImageToGallery() {
Subscription s = RxMeizhi.saveImageAndGetPathObservable(this, mImageUrl, mImageTitle)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<Uri>() {
@Override
public void call(Uri uri) {
File appDir = new File(Environment.getExternalStorageDirectory(), "Meizhi");
String msg = String.format(PictureActivity.this.getString(R.string.picture_has_save_to),
appDir.getAbsolutePath());
Toasts.showShort(msg);
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable error) {
Toasts.showLong(error.getMessage() + "\n再試試...");
}
});
addSubscription(s);
}