package gaode.zhongjh.com.common.utils; import android.content.Context; import android.content.pm.PackageManager; import android.graphics.Bitmap; import android.net.Uri; import android.os.Environment; import android.support.v4.content.FileProvider; import android.support.v4.os.EnvironmentCompat; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.lang.ref.WeakReference; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; import gaode.zhongjh.com.common.entity.SaveStrategy; /** * 有关多媒体的文件操作 * Created by zhongjh on 2018/8/23. */ public class MediaStoreCompat { private final WeakReference<Context> mContext; private SaveStrategy mSaveStrategy; // 设置目录 public MediaStoreCompat(Context context) { mContext = new WeakReference<>(context); } public SaveStrategy getSaveStrategy() { return mSaveStrategy; } /** * 检查设备是否具有相机特性。 * * @param context 检查相机特征的上下文。 * @return 如果设备具有相机特性,则为真。否则为假。 */ public static boolean hasCameraFeature(Context context) { PackageManager pm = context.getApplicationContext().getPackageManager(); return pm.hasSystemFeature(PackageManager.FEATURE_CAMERA); } /** * 设置目录 */ public void setSaveStrategy(SaveStrategy strategy) { mSaveStrategy = strategy; } /** * 创建文件 * * @param type 0是图片 1是视频 2是音频 * @return 临时文件 */ private File createFile(int type) throws IOException { String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date()); String fileName = null; switch (type) { case 0: fileName = String.format("JPEG_%s.jpg", timeStamp); break; case 1: fileName = String.format("VIDEO_%s.mp4", timeStamp); break; case 2: fileName = String.format("AUDIO_%s.mp3", timeStamp); break; } File storageDir; if (mSaveStrategy.isPublic) { storageDir = Environment.getExternalStoragePublicDirectory( mSaveStrategy.directory); assert storageDir != null; if (!storageDir.exists()) { storageDir.mkdirs(); } } else { storageDir = mContext.get().getExternalFilesDir(mSaveStrategy.directory); } // Avoid joining path components manually assert fileName != null; File tempFile = new File(storageDir, fileName); // Handle the situation that user's external storage is not ready if (!Environment.MEDIA_MOUNTED.equals(EnvironmentCompat.getStorageState(tempFile))) { return null; } return tempFile; } /** * 返回创建文件的路径 * * @param type 0是图片 1是视频 2是音频 * @return 路径 */ public File getFilePath(int type) { try { return createFile(type); } catch (IOException e) { e.printStackTrace(); } return null; } /** * 保存bitmap到file * * @return 返回file的路径 */ public File saveFileByBitmap(Bitmap bitmap) { File file = null; try { file = createFile(0); } catch (IOException e) { e.printStackTrace(); } try { assert file != null; FileOutputStream out = new FileOutputStream(file); bitmap.compress(Bitmap.CompressFormat.JPEG, 90, out); out.flush(); out.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return file; } /** * 绑定路径 */ public Uri getUri(String path) { return FileProvider.getUriForFile(mContext.get(), mSaveStrategy.authority, new File(path)); } public Uri getUri() { return FileProvider.getUriForFile(mContext.get(), mSaveStrategy.authority, new File(mSaveStrategy.directory)); } }