package me.wavever.ganklock.utils; import android.app.WallpaperManager; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; import android.os.Environment; import android.widget.Toast; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import io.reactivex.Observable; import io.reactivex.ObservableEmitter; import io.reactivex.ObservableOnSubscribe; import io.reactivex.Scheduler; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.functions.Consumer; import io.reactivex.schedulers.Schedulers; /** * Created by wavever on 2016/9/27. */ public class PhotoUtil { public static final String KEY_PHOTO_URL = "key_photo_url"; /** * @param name 图片的_id */ public static void savePhotoByBitmap(final Context context, final Bitmap bitmap, final String name) { final String fileName = name + ".jpg"; final File fileDir = new File(Environment.getExternalStorageDirectory(), "GankLock");//GankLock/Images if (!fileDir.exists()) { fileDir.mkdir(); } else if (fileDir.listFiles().length != 0) { for (File file : fileDir.listFiles()) { if (file.getName().equals(fileName)) { Toast.makeText(context, "图片已经下载了", Toast.LENGTH_SHORT).show(); return; } } } Observable.create(new ObservableOnSubscribe<String>() { @Override public void subscribe(ObservableEmitter<String> emitter) throws Exception { String photoUrl = createPhoto(context, fileDir, fileName, bitmap); emitter.onNext("图片已保存至" + photoUrl); } }).subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Consumer<String>() { @Override public void accept(String s) throws Exception { Toast.makeText(context, s, Toast.LENGTH_SHORT).show(); } }); } public static void sharePhoto(Context context,File file) { Intent intent = new Intent(); intent.setAction(Intent.ACTION_SEND); intent.putExtra(Intent.EXTRA_STREAM,Uri.fromFile(file)); intent.setType("image/*"); context.startActivity(Intent.createChooser(intent, "分享到")); } public static void setWallPaper(Context context,File file){ WallpaperManager manager = WallpaperManager.getInstance(context); try { manager.setBitmap(BitmapFactory.decodeFile(file.getAbsolutePath())); } catch (IOException e) { e.printStackTrace(); } } private static String createPhoto(Context context, File fileDir, String fileName, Bitmap bitmap) { File file = new File(fileDir, fileName); try { FileOutputStream fos = new FileOutputStream(file); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos); fos.flush(); fos.close(); } catch (Exception e) { e.printStackTrace(); } /*//把文件插入系统图库 try { Media.insertImage(context.getContentResolver(), file.getAbsolutePath(), fileName, null); } catch (FileNotFoundException e) { e.printStackTrace(); } //通知图库更新 context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + file.getAbsolutePath())));*/ return file.getAbsolutePath(); } /** * 从File中加载缩放过的图片 * * @param path * @param reqWidth * @param reqHeight * @return */ public static Bitmap decodeSampledBitmapFromFile(String path, int reqWidth, int reqHeight) { final BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; //BitmapFactory只会解析图片的原始宽高,不会真正的加载图片 BitmapFactory.decodeFile(path,options); options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); options.inJustDecodeBounds = false; return BitmapFactory.decodeFile(path, options); } /** * 计算合适的采样率inSampleSize * * @param options * @param reqWidth * @param reqHeight */ private static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) { if(reqWidth == 0 || reqHeight == 0){ return 1; } final int width = options.outWidth; final int height = options.outHeight; int inSampleSize = 1; if (width > reqWidth || height > reqHeight) { final int halfWidth = width / 2; final int halfHeight = height / 2; while (halfWidth / inSampleSize >= reqWidth && halfHeight / inSampleSize >= reqHeight) { inSampleSize *= 2; //inSampleSize的值为2的指数 } } return inSampleSize; } }