package com.liyu.fakeweather.utils; import android.Manifest; import android.app.Activity; import android.content.ContentResolver; import android.content.ContentValues; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.Canvas; import android.net.Uri; import android.os.Environment; import android.provider.MediaStore; import android.widget.ScrollView; import com.bumptech.glide.Glide; import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.request.target.Target; import com.tbruyelle.rxpermissions.RxPermissions; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import rx.Observable; import rx.Subscriber; import rx.functions.Func1; import rx.schedulers.Schedulers; /** * Created by liyu on 2016/11/17. */ public class RxImage { public static Observable<Uri> saveImageAndGetPathObservable(final Activity context, final String url, final String title) { return new RxPermissions(context).request(Manifest.permission.WRITE_EXTERNAL_STORAGE).flatMap(new Func1<Boolean, Observable<Uri>>() { @Override public Observable<Uri> call(Boolean aBoolean) { return Observable .create(new Observable.OnSubscribe<Bitmap>() { @Override public void call(Subscriber<? super Bitmap> subscriber) { Bitmap bitmap = null; try { bitmap = Glide.with(context) .load(url) .asBitmap() .diskCacheStrategy(DiskCacheStrategy.ALL) .into(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL) .get(); } catch (Exception e) { subscriber.onError(e); } if (bitmap == null) { subscriber.onError(new Exception("无法下载到图片!")); } subscriber.onNext(bitmap); subscriber.onCompleted(); } }) .flatMap(new Func1<Bitmap, Observable<Uri>>() { @Override public Observable<Uri> call(Bitmap bitmap) { File appDir = new File(Environment.getExternalStorageDirectory(), "Girls"); 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); Uri contentURI = getImageContentUri(context, file.getAbsolutePath()); return Observable.just(contentURI); } }).subscribeOn(Schedulers.io()); } }); } public static Observable<Uri> saveText2ImageObservable(final Activity context, final ScrollView view) { return Observable .create(new Observable.OnSubscribe<Bitmap>() { @Override public void call(Subscriber<? super Bitmap> subscriber) { Bitmap bitmap = null; try { bitmap = saveScrollViewToBitmap(view); } catch (Exception e) { subscriber.onError(e); } if (bitmap == null) { subscriber.onError(new Exception("无法生产图片!")); } subscriber.onNext(bitmap); subscriber.onCompleted(); } }) .flatMap(new Func1<Bitmap, Observable<Uri>>() { @Override public Observable<Uri> call(Bitmap bitmap) { File appDir = new File(Environment.getExternalStorageDirectory(), "Girls"); if (!appDir.exists()) { appDir.mkdir(); } String fileName = "share.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); Uri contentURI = getImageContentUri(context, file.getAbsolutePath()); return Observable.just(contentURI); } }).subscribeOn(Schedulers.io()); } public static String getRealFilePath(final Context context, final Uri uri) { if (null == uri) return null; final String scheme = uri.getScheme(); String data = null; if (scheme == null) data = uri.getPath(); else if (ContentResolver.SCHEME_FILE.equals(scheme)) { data = uri.getPath(); } else if (ContentResolver.SCHEME_CONTENT.equals(scheme)) { Cursor cursor = context.getContentResolver().query(uri, new String[]{MediaStore.Images.ImageColumns.DATA}, null, null, null); if (null != cursor) { if (cursor.moveToFirst()) { int index = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA); if (index > -1) { data = cursor.getString(index); } } cursor.close(); } } return data; } public static Uri getImageContentUri(Context context, String absPath) { Cursor cursor = context.getContentResolver().query( MediaStore.Images.Media.EXTERNAL_CONTENT_URI , new String[]{MediaStore.Images.Media._ID} , MediaStore.Images.Media.DATA + "=? " , new String[]{absPath}, null); if (cursor != null && cursor.moveToFirst()) { int id = cursor.getInt(cursor.getColumnIndex(MediaStore.MediaColumns._ID)); return Uri.withAppendedPath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, Integer.toString(id)); } else if (!absPath.isEmpty()) { ContentValues values = new ContentValues(); values.put(MediaStore.Images.Media.DATA, absPath); return context.getContentResolver().insert( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); } else { return null; } } private static Bitmap saveScrollViewToBitmap(ScrollView scrollView) { int h = 0; Bitmap bitmap = null; for (int i = 0; i < scrollView.getChildCount(); i++) { h += scrollView.getChildAt(i).getHeight(); } bitmap = Bitmap.createBitmap(scrollView.getWidth(), h, Bitmap.Config.ARGB_8888); final Canvas canvas = new Canvas(bitmap); scrollView.draw(canvas); return bitmap; } }