文件管理工具类
public final class FileUtil {
? ? //格式化的模板
? ? private static final String TIME_FORMAT = "_yyyyMMdd_HHmmss";
? ? private static final String SDCARD_DIR = Environment.getExternalStorageDirectory().getPath();
? ? private static String getTimeFormatName(String timeFormatHeader) {
? ? ? ? final Date date = new Date(System.currentTimeMillis());
? ? ? ? //必須要加上單引號
? ? ? ? final SimpleDateFormat dateFormat = new SimpleDateFormat("'" + timeFormatHeader + "'" + TIME_FORMAT, Locale.getDefault());
? ? ? ? return dateFormat.format(date);
? ? }
? ? /**
? ? ?* 創建新的圖片文件
? ? ?*
? ? ?* @param imageUrl
? ? ?* @return
? ? ?*/
? ? public static File getNewFile(String imageUrl) {
? ? ? ? File file;
? ? ? ? if (TextUtils.isEmpty(imageUrl)) {
? ? ? ? ? ? file = new File(Environment.getExternalStorageDirectory(), System.currentTimeMillis() + ".jpg");//filePath 圖片地址
? ? ? ? } else {
? ? ? ? ? ? file = new File(imageUrl);//filePath 圖片地址
? ? ? ? }
? ? ? ? if (!file.exists()) {
? ? ? ? ? ? try {
? ? ? ? ? ? ? ? file.createNewFile();
? ? ? ? ? ? } catch (IOException e) {
? ? ? ? ? ? ? ? // TODO Auto-generated catch block
? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? return file;
? ? }
? ? /**
? ? ?* @param timeFormatHeader 格式化的頭(除去時間部分)
? ? ?* @param extension? ? ? ? 后綴名
? ? ?* @return 返回時間格式化后的文件名
? ? ?*/
? ? public static String getFileNameByTime(String timeFormatHeader, String extension) {
? ? ? ? return getTimeFormatName(timeFormatHeader) + "." + extension;
? ? }
? ? @SuppressWarnings("ResultOfMethodCallIgnored")
? ? private static File createDir(String sdcardDirName) {
? ? ? ? //拼接成SD卡中完整的dir
? ? ? ? final String dir = SDCARD_DIR + "/" + sdcardDirName + "/";
? ? ? ? final File fileDir = new File(dir);
? ? ? ? if (!fileDir.exists()) {
? ? ? ? ? ? fileDir.mkdirs();
? ? ? ? }
? ? ? ? return fileDir;
? ? }
? ? @SuppressWarnings("ResultOfMethodCallIgnored")
? ? public static File createFile(String sdcardDirName, String fileName) {
? ? ? ? return new File(createDir(sdcardDirName), fileName);
? ? }
? ? private static File createFileByTime(String sdcardDirName, String timeFormatHeader, String extension) {
? ? ? ? final String fileName = getFileNameByTime(timeFormatHeader, extension);
? ? ? ? return createFile(sdcardDirName, fileName);
? ? }
? ? //獲取文件的MIME
? ? public static String getMimeType(String filePath) {
? ? ? ? final String extension = getExtension(filePath);
? ? ? ? return MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
? ? }
? ? //獲取文件的后綴名
? ? public static String getExtension(String filePath) {
? ? ? ? String suffix = "";
? ? ? ? final File file = new File(filePath);
? ? ? ? final String name = file.getName();
? ? ? ? final int idx = name.lastIndexOf('.');
? ? ? ? if (idx > 0) {
? ? ? ? ? ? suffix = name.substring(idx + 1);
? ? ? ? }
? ? ? ? return suffix;
? ? }
? ? /**
? ? ?* 保存Bitmap到SD卡中
? ? ?*
? ? ?* @param dir? ? ? 目錄名,只需要寫自己的相對目錄名即可
? ? ?* @param compress 壓縮比例 100是不壓縮,值約小壓縮率越高
? ? ?* @return 返回該文件
? ? ?*/
? ? public static File saveBitmap(Bitmap mBitmap, String dir, int compress) {
? ? ? ? final String sdStatus = Environment.getExternalStorageState();
? ? ? ? // 檢測sd是否可用
? ? ? ? if (!sdStatus.equals(Environment.MEDIA_MOUNTED)) {
? ? ? ? ? ? return null;
? ? ? ? }
? ? ? ? FileOutputStream fos = null;
? ? ? ? BufferedOutputStream bos = null;
? ? ? ? File fileName = createFileByTime(dir, "3rde", "jpg");
? ? ? ? try {
? ? ? ? ? ? fos = new FileOutputStream(fileName);
? ? ? ? ? ? bos = new BufferedOutputStream(fos);
? ? ? ? ? ? mBitmap.compress(Bitmap.CompressFormat.JPEG, compress, bos);// 把數據寫入文件
? ? ? ? } catch (FileNotFoundException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? } finally {
? ? ? ? ? ? try {
? ? ? ? ? ? ? ? if (bos != null) {
? ? ? ? ? ? ? ? ? ? bos.flush();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? if (bos != null) {
? ? ? ? ? ? ? ? ? ? bos.close();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? //關閉流
? ? ? ? ? ? ? ? if (fos != null) {
? ? ? ? ? ? ? ? ? ? fos.flush();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? if (fos != null) {
? ? ? ? ? ? ? ? ? ? fos.close();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? } catch (IOException e) {
? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? refreshDCIM();
? ? ? ? return fileName;
? ? }
? ? public static File writeToDisk(InputStream is, String dir, String name) {
? ? ? ? final File file = FileUtil.createFile(dir, name);
? ? ? ? BufferedInputStream bis = null;
? ? ? ? FileOutputStream fos = null;
? ? ? ? BufferedOutputStream bos = null;
? ? ? ? try {
? ? ? ? ? ? bis = new BufferedInputStream(is);
? ? ? ? ? ? fos = new FileOutputStream(file);
? ? ? ? ? ? bos = new BufferedOutputStream(fos);
? ? ? ? ? ? byte data[] = new byte[1024 * 4];
? ? ? ? ? ? int count;
? ? ? ? ? ? while ((count = bis.read(data)) != -1) {
? ? ? ? ? ? ? ? bos.write(data, 0, count);
? ? ? ? ? ? }
? ? ? ? ? ? bos.flush();
? ? ? ? ? ? fos.flush();
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? } finally {
? ? ? ? ? ? try {
? ? ? ? ? ? ? ? if (bos != null) {
? ? ? ? ? ? ? ? ? ? bos.close();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? if (fos != null) {
? ? ? ? ? ? ? ? ? ? fos.close();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? if (bis != null) {
? ? ? ? ? ? ? ? ? ? bis.close();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? is.close();
? ? ? ? ? ? } catch (IOException e) {
? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? return file;
? ? }
? ? public static File writeToDisk(InputStream is, String dir, String prefix, String extension) {
? ? ? ? final File file = FileUtil.createFileByTime(dir, prefix, extension);
? ? ? ? BufferedInputStream bis = null;
? ? ? ? FileOutputStream fos = null;
? ? ? ? BufferedOutputStream bos = null;
? ? ? ? try {
? ? ? ? ? ? bis = new BufferedInputStream(is);
? ? ? ? ? ? fos = new FileOutputStream(file);
? ? ? ? ? ? bos = new BufferedOutputStream(fos);
? ? ? ? ? ? byte data[] = new byte[1024 * 4];
? ? ? ? ? ? int count;
? ? ? ? ? ? while ((count = bis.read(data)) != -1) {
? ? ? ? ? ? ? ? bos.write(data, 0, count);
? ? ? ? ? ? }
? ? ? ? ? ? bos.flush();
? ? ? ? ? ? fos.flush();
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? } finally {
? ? ? ? ? ? try {
? ? ? ? ? ? ? ? if (bos != null) {
? ? ? ? ? ? ? ? ? ? bos.close();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? if (fos != null) {
? ? ? ? ? ? ? ? ? ? fos.close();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? if (bis != null) {
? ? ? ? ? ? ? ? ? ? bis.close();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? is.close();
? ? ? ? ? ? } catch (IOException e) {
? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? return file;
? ? }
? ? /**
? ? ?* 通知系統刷新系統相冊,使照片展現出來
? ? ?*/
? ? private static void refreshDCIM() {
? ? ? ? if (Build.VERSION.SDK_INT >= 19) {
? ? ? ? ? ? //兼容android4.4版本,只掃描存放照片的目錄
? ? ? ? ? ? MediaScannerConnection.scanFile(BaseApplication.getContext(),
? ? ? ? ? ? ? ? ? ? new String[]{Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getPath()},
? ? ? ? ? ? ? ? ? ? null, null);
? ? ? ? } else {
? ? ? ? ? ? //掃描整個SD卡來更新系統圖庫,當文件很多時用戶體驗不佳,且不適合4.4以上版本
? ? ? ? ? ? BaseApplication.getContext().sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" +
? ? ? ? ? ? ? ? ? ? Environment.getExternalStorageDirectory())));
? ? ? ? }
? ? }
? ? /**
? ? ?* 讀取raw目錄中的文件,并返回為字符串
? ? ?*/
? ? public static String getRawFile(int id) {
? ? ? ? final InputStream is = BaseApplication.getContext().getResources().openRawResource(id);
? ? ? ? final BufferedInputStream bis = new BufferedInputStream(is);
? ? ? ? final InputStreamReader isr = new InputStreamReader(bis);
? ? ? ? final BufferedReader br = new BufferedReader(isr);
? ? ? ? final StringBuilder stringBuilder = new StringBuilder();
? ? ? ? String str;
? ? ? ? try {
? ? ? ? ? ? while ((str = br.readLine()) != null) {
? ? ? ? ? ? ? ? stringBuilder.append(str);
? ? ? ? ? ? }
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? } finally {
? ? ? ? ? ? try {
? ? ? ? ? ? ? ? br.close();
? ? ? ? ? ? ? ? isr.close();
? ? ? ? ? ? ? ? bis.close();
? ? ? ? ? ? ? ? is.close();
? ? ? ? ? ? } catch (IOException e) {
? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? return stringBuilder.toString();
? ? }
? ? public static void setIconFont(String path, TextView textView) {
? ? ? ? final Typeface typeface = Typeface.createFromAsset(BaseApplication.getContext().getAssets(), path);
? ? ? ? textView.setTypeface(typeface);
? ? }
? ? /**
? ? ?* 讀取assets目錄下的文件,并返回字符串
? ? ?*/
? ? public static String getAssetsFile(String name) {
? ? ? ? InputStream is = null;
? ? ? ? BufferedInputStream bis = null;
? ? ? ? InputStreamReader isr = null;
? ? ? ? BufferedReader br = null;
? ? ? ? StringBuilder stringBuilder = null;
? ? ? ? final AssetManager assetManager = BaseApplication.getContext().getAssets();
? ? ? ? try {
? ? ? ? ? ? is = assetManager.open(name);
? ? ? ? ? ? bis = new BufferedInputStream(is);
? ? ? ? ? ? isr = new InputStreamReader(bis);
? ? ? ? ? ? br = new BufferedReader(isr);
? ? ? ? ? ? stringBuilder = new StringBuilder();
? ? ? ? ? ? String str;
? ? ? ? ? ? while ((str = br.readLine()) != null) {
? ? ? ? ? ? ? ? stringBuilder.append(str);
? ? ? ? ? ? }
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? } finally {
? ? ? ? ? ? try {
? ? ? ? ? ? ? ? if (br != null) {
? ? ? ? ? ? ? ? ? ? br.close();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? if (isr != null) {
? ? ? ? ? ? ? ? ? ? isr.close();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? if (bis != null) {
? ? ? ? ? ? ? ? ? ? bis.close();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? if (is != null) {
? ? ? ? ? ? ? ? ? ? is.close();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? assetManager.close();
? ? ? ? ? ? } catch (IOException e) {
? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? if (stringBuilder != null) {
? ? ? ? ? ? return stringBuilder.toString();
? ? ? ? } else {
? ? ? ? ? ? return null;
? ? ? ? }
? ? }
? ? /**
? ? ?* 判斷SD卡是否可用
? ? ?*
? ? ?* @return SD卡可用返回true
? ? ?*/
? ? public static boolean hasSdcard() {
? ? ? ? String status = Environment.getExternalStorageState();
? ? ? ? return Environment.MEDIA_MOUNTED.equals(status);
? ? }
? ? 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)) {
? ? ? ? ? ? final Cursor cursor = context.getContentResolver().query(uri, new String[]{MediaStore.Images.ImageColumns.DATA}, null, null, null);
? ? ? ? ? ? if (null != cursor) {
? ? ? ? ? ? ? ? if (cursor.moveToFirst()) {
? ? ? ? ? ? ? ? ? ? final int index = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
? ? ? ? ? ? ? ? ? ? if (index > -1) {
? ? ? ? ? ? ? ? ? ? ? ? data = cursor.getString(index);
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? cursor.close();
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? return data;
? ? }
? ? /**
? ? ?* 相機拍照保存的文件全路徑
? ? ?*/
? ? public static File getTakePhotoFile() {
? ? ? ? File file = null;
? ? ? ? try {
? ? ? ? ? ? file = new File(Environment.getExternalStorageDirectory(), "takephoto.jpg");
? ? ? ? ? ? if (!file.exists()) {
? ? ? ? ? ? ? ? file.createNewFile();
? ? ? ? ? ? }
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? ? ? return file;
? ? }
? ? /**
? ? ?* 相機拍照保存的文件全路徑(裁剪后的臨時路徑)
? ? ?*/
? ? public static File getTempPhotoFile() {
? ? ? ? File file = null;
? ? ? ? try {
? ? ? ? ? ? file = new File(Environment.getExternalStorageDirectory(), System.currentTimeMillis() + ".jpg");
? ? ? ? ? ? if (!file.exists()) {
? ? ? ? ? ? ? ? file.createNewFile();
? ? ? ? ? ? }
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? ? ? return file;
? ? }
? ? /**
? ? ?* 相機拍照保存的文件全路徑
? ? ?*/
? ? public static String getTakePhotoFileDirectory() {
? ? ? ? String dirs = android.os.Environment.getExternalStorageDirectory().getAbsolutePath();
? ? ? ? File fileDirectory = new File(dirs);
? ? ? ? if (!fileDirectory.exists()) {
? ? ? ? ? ? fileDirectory.mkdirs();
? ? ? ? }
? ? ? ? return dirs;
? ? }
? ? /**
? ? ?* 創建文件
? ? ?*
? ? ?* @param path
? ? ?* @return
? ? ?*/
? ? public static File createDirFile(String path) {
? ? ? ? int pos = path.lastIndexOf("/");
? ? ? ? String dirpath = path.substring(0, pos + 1);
? ? ? ? if (!dirpath.startsWith("/"))
? ? ? ? ? ? dirpath = "/" + dirpath;
? ? ? ? File f = new File(dirpath);
? ? ? ? if (!f.exists())
? ? ? ? ? ? f.mkdirs();
? ? ? ? return new File(path);
? ? }
? ? /**
? ? ?* 通過文件名,判斷指定目錄下是否有改文件
? ? ?*
? ? ?* @param filename
? ? ?*/
? ? public static File isExitByFileName(String path, String filename) {
? ? ? ? File isExitFile = null;
? ? ? ? File dir = new File(path);
? ? ? ? File[] listFiles = dir.listFiles();
? ? ? ? if (listFiles != null) {
? ? ? ? ? ? for (File file : listFiles) {
? ? ? ? ? ? ? ? if (file.getName().equals(filename)) {
? ? ? ? ? ? ? ? ? ? isExitFile = file;
? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? return isExitFile;
? ? }
? ? /**
? ? ?* 輸入流轉文件并保存到本地
? ? ?*
? ? ?* @param is? ? ? ?文件輸入流
? ? ?* @param savePath 保存的路徑
? ? ?* @param fileName 文件名
? ? ?* @return
? ? ?*/
? ? public static File InputStreamToFile(InputStream is, String savePath, String fileName) {
? ? ? ? try {
? ? ? ? ? ? File dir = new File(savePath);
? ? ? ? ? ? if (!dir.exists()) {
? ? ? ? ? ? ? ? dir.mkdirs();
? ? ? ? ? ? }
? ? ? ? ? ? File outFile = new File(dir + "/" + fileName);
? ? ? ? ? ? if (outFile != null) {
? ? ? ? ? ? ? ? FileOutputStream fos = new FileOutputStream(outFile);
? ? ? ? ? ? ? ? byte[] buffer = new byte[1024 * 10];
? ? ? ? ? ? ? ? int count = 0;
? ? ? ? ? ? ? ? while ((count = is.read(buffer)) != -1) {
? ? ? ? ? ? ? ? ? ? fos.write(buffer, 0, count);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? is.close();
? ? ? ? ? ? ? ? fos.flush();
? ? ? ? ? ? ? ? fos.close();
? ? ? ? ? ? ? ? return outFile;
? ? ? ? ? ? }
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? ? ? return null;
? ? }
? ? /**
? ? ?* create the targer file's dir
? ? ?*
? ? ?* @param path the file's absolute path
? ? ?*/
? ? public static void createDirs(String path) {
? ? ? ? path = path.substring(0, path.lastIndexOf("/") + 1);
? ? ? ? File dir = new File(path);
? ? ? ? if (!dir.exists()) {
? ? ? ? ? ? dir.mkdirs();
? ? ? ? }
? ? }
? ? /***
? ? ?* 刪除指定目錄下得所有文件
? ? ?* @param dirPath
? ? ?*/
? ? public static boolean clearAllFile(String dirPath) {
? ? ? ? File file = new File(dirPath);
? ? ? ? if (file != null && file.exists()) {
? ? ? ? ? ? if (file.isFile()) {
? ? ? ? ? ? ? ? return file.delete();
? ? ? ? ? ? } else if (file.isDirectory()) {
? ? ? ? ? ? ? ? File[] listFiles = file.listFiles();
? ? ? ? ? ? ? ? for (int i = 0; listFiles != null && i < listFiles.length; i++) {
? ? ? ? ? ? ? ? ? ? if (listFiles[i].isFile()) {
? ? ? ? ? ? ? ? ? ? ? ? if (!listFiles[i].delete()) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? LogUtils.d("Delete file failed!" + dirPath);
? ? ? ? ? ? ? ? ? ? ? ? ? ? return false;
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? ? ? ? ? if (!clearAllFile(listFiles[i].getPath())) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? return false;
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? LogUtils.d("Delete file----file is not exists----" + dirPath);
? ? ? ? return true;
? ? }
? ? /*****
? ? ?* 刪除指定路徑APK文件
? ? ?* @param path
? ? ?*/
? ? public static void rmoveAPKFile(String path) {
? ? ? ? File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), path.substring(path.lastIndexOf("/")));
? ? ? ? if (file.exists()) {
? ? ? ? ? ? file.delete();
? ? ? ? }
? ? ? ? if (!file.exists())
? ? ? ? ? ? LogUtils.d("安裝文件刪除成功");
? ? }
? ? /**
? ? ?* 創建目錄
? ? ?*
? ? ?* @param path
? ? ?* @return
? ? ?*/
? ? public static File createDirByPath(String path) {
? ? ? ? File file = new File(path);
? ? ? ? if (file != null && !file.exists()) {
? ? ? ? ? ? file.mkdirs();
? ? ? ? }
? ? ? ? return file;
? ? }
? ? /**
? ? ?* 復制文件到指定目錄
? ? ?*
? ? ?* @param is
? ? ?* @param dirPath
? ? ?* @param fileName
? ? ?*/
? ? public static File copyFile(InputStream is, String dirPath, String fileName) {
? ? ? ? try {
? ? ? ? ? ? if (is != null) {
? ? ? ? ? ? ? ? File file = new File(createDirByPath(dirPath), fileName);
? ? ? ? ? ? ? ? FileOutputStream fos = new FileOutputStream(file);
? ? ? ? ? ? ? ? byte[] buffer = new byte[1024 * 100];
? ? ? ? ? ? ? ? int len = 0;
? ? ? ? ? ? ? ? while ((len = is.read(buffer)) != -1) {
? ? ? ? ? ? ? ? ? ? fos.write(buffer, 0, len);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? is.close();
? ? ? ? ? ? ? ? fos.flush();
? ? ? ? ? ? ? ? fos.close();
? ? ? ? ? ? ? ? return file;
? ? ? ? ? ? }
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? return null;
? ? ? ? }
? ? ? ? return null;
? ? }
? ? /**
? ? ?* @param uri The Uri to check.
? ? ?* @return Whether the Uri authority is ExternalStorageProvider.
? ? ?*/
? ? public static boolean isExternalStorageDocument(Uri uri) {
? ? ? ? return "com.android.externalstorage.documents".equals(uri.getAuthority());
? ? }
? ? /**
? ? ?* @param uri The Uri to check.
? ? ?* @return Whether the Uri authority is DownloadsProvider.
? ? ?*/
? ? public static boolean isDownloadsDocument(Uri uri) {
? ? ? ? return "com.android.providers.downloads.documents".equals(uri.getAuthority());
? ? }
? ? /**
? ? ?* @param uri The Uri to check.
? ? ?* @return Whether the Uri authority is MediaProvider.
? ? ?*/
? ? public static boolean isMediaDocument(Uri uri) {
? ? ? ? return "com.android.providers.media.documents".equals(uri.getAuthority());
? ? }
? ? /*******
? ? ?* 相冊選取圖片得到的Uri是Content Uri而拍照后使用的是文件路徑生成的File Uri,
? ? ?* 看來問題就是出在這里,并不是說我們app的targetSDKVersion不是24就可以使用File Uri,
? ? ?* 但是photos app的targetSdkVersion可能是24導致了它接受了File Uri而崩潰,
? ? ?* 那么我們需要做的就是把File Uri換成Content Uri。這里需要提的是,
? ? ?* 直接按照這里的做法去更換Content Uri并不能生效,會提示“Can not edit image under 50*50 pixels”的錯誤toast提示,
? ? ?* 其實是photos app找不到Content Uri傳進去的圖片文件。那么我們需要換一種方式去更換Content Uri,
? ? ?* 我們在stackoverflow上面找到更換Content Uri的方法,需要注意的是不是所有的File Uri都可以轉換成Content Uri,應該是多媒體相關的文件才可以。
? ? ?* @return
? ? ?* 參考 http://www.jianshu.com/p/c73b959b6bcf
? ? ?*/
? ? public static Uri getImageContentUri(String filePath) {
? ? ? ? Cursor cursor = BaseApplication.getContext().getContentResolver().query(
? ? ? ? ? ? ? ? MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
? ? ? ? ? ? ? ? new String[]{MediaStore.Images.Media._ID},
? ? ? ? ? ? ? ? MediaStore.Images.Media.DATA + "=? ",
? ? ? ? ? ? ? ? new String[]{filePath}, null);
? ? ? ? if (cursor != null && cursor.moveToFirst()) {
? ? ? ? ? ? int id = cursor.getInt(cursor
? ? ? ? ? ? ? ? ? ? .getColumnIndex(MediaStore.MediaColumns._ID));
? ? ? ? ? ? Uri baseUri = Uri.parse("content://media/external/images/media");
? ? ? ? ? ? return Uri.withAppendedPath(baseUri, "" + id);
? ? ? ? } else {
? ? ? ? ? ? if (new File(filePath).exists()) {
? ? ? ? ? ? ? ? ContentValues values = new ContentValues();
? ? ? ? ? ? ? ? values.put(MediaStore.Images.Media.DATA, filePath);
? ? ? ? ? ? ? ? return BaseApplication.getContext().getContentResolver().insert(
? ? ? ? ? ? ? ? ? ? ? ? MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? return null;
? ? ? ? ? ? }
? ? ? ? }
? ? }
? ? /****
? ? ?* 讀取Asset中的文件
? ? ?* @param assetManager
? ? ?* @param path
? ? ?* @return
? ? ?*/
? ? public static String getAssetFileToStr(AssetManager assetManager, String path) {
? ? ? ? BufferedReader bufferedReader = null;
? ? ? ? StringBuilder result = new StringBuilder();
? ? ? ? try {
? ? ? ? ? ? bufferedReader = new BufferedReader(new InputStreamReader(assetManager.open(path), "UTF-8"));
? ? ? ? ? ? for (String ignored = null; (ignored = bufferedReader.readLine()) != null; ) {
? ? ? ? ? ? ? ? result.append(ignored);
? ? ? ? ? ? }
? ? ? ? } catch (IOException var13) {
? ? ? ? ? ? return "";
? ? ? ? } finally {
? ? ? ? ? ? if (bufferedReader != null) {
? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? bufferedReader.close();
? ? ? ? ? ? ? ? } catch (IOException var12) {
? ? ? ? ? ? ? ? ? ? ;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? return result.toString().trim();
? ? }
? ? /******
? ? ?* 根據URI獲取文件絕對路徑
? ? ?* @param contentUri
? ? ?* @return
? ? ?* liukui 2017/05/19
? ? ?*/
? ? public static String getRealPathFromURI(Uri contentUri) {
? ? ? ? if (contentUri == null) return null;
? ? ? ? int sdkVersion = Build.VERSION.SDK_INT;
? ? ? ? if (sdkVersion < 11) {
? ? ? ? ? ? // SDK < Api11
? ? ? ? ? ? return getRealPathFromUri_BelowApi11(contentUri);
? ? ? ? }
? ? ? ? if (sdkVersion < 19) {
? ? ? ? ? ? // SDK > 11 && SDK < 19
? ? ? ? ? ? return getRealPathFromUri_Api11To18(contentUri);
? ? ? ? }
? ? ? ? // SDK > 19
? ? ? ? return getRealPathFromUri_AboveApi19(contentUri);
? ? }
? ? /**
? ? ?* 適配api19以上,根據uri獲取圖片的絕對路徑
? ? ?* liukui 2017/05/19
? ? ?*/
? ? @SuppressLint("NewApi")
? ? private static String getRealPathFromUri_AboveApi19(Uri uri) {
? ? ? ? if (DocumentsContract.isDocumentUri(BaseApplication.getInstance(), uri)) { // 【DocumentProvider】
? ? ? ? ? ? if (isExternalStorageDocument(uri)) { // 【ExternalStorageProvider】
? ? ? ? ? ? ? ? String docId = DocumentsContract.getDocumentId(uri);
? ? ? ? ? ? ? ? String[] split = docId.split(":");
? ? ? ? ? ? ? ? String type = split[0];
? ? ? ? ? ? ? ? if ("primary".equalsIgnoreCase(type))
? ? ? ? ? ? ? ? ? ? return Environment.getExternalStorageDirectory() + "/" + split[1];
? ? ? ? ? ? } else if (isDownloadsDocument(uri)) { // 【DownloadsProvider】
? ? ? ? ? ? ? ? String id = DocumentsContract.getDocumentId(uri);
? ? ? ? ? ? ? ? Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
? ? ? ? ? ? ? ? return getDataColumn(contentUri, null, null);
? ? ? ? ? ? } else if (isMediaDocument(uri)) { // 【MediaProvider】
? ? ? ? ? ? ? ? String docId = DocumentsContract.getDocumentId(uri);
? ? ? ? ? ? ? ? String[] split = docId.split(":");
? ? ? ? ? ? ? ? String type = split[0];
? ? ? ? ? ? ? ? Uri contentUri = null;
? ? ? ? ? ? ? ? if ("image".equals(type)) contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
? ? ? ? ? ? ? ? else if ("video".equals(type))
? ? ? ? ? ? ? ? ? ? contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
? ? ? ? ? ? ? ? else if ("audio".equals(type))
? ? ? ? ? ? ? ? ? ? contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
? ? ? ? ? ? ? ? String selection = "_id=?";
? ? ? ? ? ? ? ? String[] selectionArgs = new String[]{split[1]};
? ? ? ? ? ? ? ? return getDataColumn(contentUri, selection, selectionArgs);
? ? ? ? ? ? }
? ? ? ? } else if ("content".equalsIgnoreCase(uri.getScheme())) { // 【MediaStore (and general)】
? ? ? ? ? ? return getDataColumn(uri, null, null);
? ? ? ? } else if ("file".equalsIgnoreCase(uri.getScheme())) { // 【File】
? ? ? ? ? ? return uri.getPath();
? ? ? ? }
? ? ? ? return "";
? ? }
? ? /**
? ? ?* Get the value of the data column for this Uri. This is useful for MediaStore Uris, and other file-based ContentProviders.
? ? ?*
? ? ?* @param uri? ? ? ? ? ?The Uri to query.
? ? ?* @param selection? ? ?(Optional) Filter used in the query.
? ? ?* @param selectionArgs (Optional) Selection arguments used in the query.
? ? ?* @return The value of the _data column, which is typically a file path.
? ? ?*/
? ? public static String getDataColumn(Uri uri, String selection, String[] selectionArgs) {
? ? ? ? Cursor cursor = null;
? ? ? ? String column = "_data";
? ? ? ? String[] projection = {column};
? ? ? ? String result = "";
? ? ? ? cursor = BaseApplication.getContext().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) {
? ? ? ? ? ? ? ? ? ? result = cursor.getString(index);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? cursor.close();
? ? ? ? }
? ? ? ? return result;
? ? }
? ? /**
? ? ?* 適配api11-api18,根據uri獲取圖片的絕對路徑
? ? ?* liukui 2017/05/19
? ? ?*/
? ? private static String getRealPathFromUri_Api11To18(Uri uri) {
? ? ? ? String filePath = null;
? ? ? ? String[] projection = {MediaStore.Images.Media.DATA};
? ? ? ? CursorLoader loader = new CursorLoader(BaseApplication.getInstance(), uri, projection, null,
? ? ? ? ? ? ? ? null, null);
? ? ? ? Cursor cursor = loader.loadInBackground();
? ? ? ? if (cursor == null)
? ? ? ? ? ? return "";
? ? ? ? cursor.moveToFirst();
? ? ? ? filePath = cursor.getString(cursor.getColumnIndex(projection[0]));
? ? ? ? cursor.close();
? ? ? ? return filePath;
? ? }
? ? /**
? ? ?* 適配api11以下(不包括api11),根據uri獲取圖片的絕對路徑
? ? ?* liukui 2017/05/19
? ? ?*/
? ? private static String getRealPathFromUri_BelowApi11(Uri uri) {
? ? ? ? String filePath = null;
? ? ? ? String[] projection = {MediaStore.Images.Media.DATA};
? ? ? ? Cursor cursor = BaseApplication.getInstance().getContentResolver().query(uri, projection,
? ? ? ? ? ? ? ? null, null, null);
? ? ? ? if (cursor == null)
? ? ? ? ? ? return "";
? ? ? ? cursor.moveToFirst();
? ? ? ? filePath = cursor.getString(cursor.getColumnIndex(projection[0]));
? ? ? ? cursor.close();
? ? ? ? return filePath;
? ? }
? ? public static void DeleteFile(String filePath) {
? ? ? ? File file = new File(filePath);
? ? ? ? if (file.exists()) {
? ? ? ? ? ? if (file.getAbsoluteFile().delete()) {
? ? ? ? ? ? ? ? LogUtils.d(file.getName() + " 刪除成功!");
? ? ? ? ? ? }
? ? ? ? }
? ? }
? ? /**
? ? ?* 打開文件
? ? ?* 兼容7.0
? ? ?*
? ? ?* @param context? ? ?activity
? ? ?* @param file? ? ? ? File
? ? ?* @param contentType 文件類型如:文本(text/html)
? ? ?*? ? ? ? ? ? ? ? ? ? 當手機中沒有一個app可以打開file時會拋ActivityNotFoundException
? ? ?*/
? ? public static void startActionFile(Context context, File file, String contentType) throws ActivityNotFoundException {
? ? ? ? if (context == null) {
? ? ? ? ? ? return;
? ? ? ? }
? ? ? ? Intent intent = new Intent(Intent.ACTION_VIEW);
? ? ? ? intent.addCategory(Intent.CATEGORY_DEFAULT);
? ? ? ? intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
? ? ? ? intent.setFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);//增加讀寫權限
? ? ? ? intent.setDataAndType(getUriFromFile(), contentType);
? ? ? ? if (!(context instanceof Activity)) {
? ? ? ? ? ? intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
? ? ? ? }
? ? ? ? context.startActivity(intent);
? ? }
? ? public static Uri getUriFromFile() {
? ? ? ? File file = getTakePhotoFile();
? ? ? ? if (file == null) {
? ? ? ? ? ? throw new NullPointerException();
? ? ? ? }
? ? ? ? Uri uri;
? ? ? ? if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
? ? ? ? ? ? //uri = FileProvider.getUriForFile(BaseApplication.getInstance(), BuildConfig.APPLICATION_ID + ".fileprovider", file);
? ? ? ? ? ? String pageName = BaseApplication.getInstance().getAppFrom().equals(BaseStringUtils.AppFromParent) ? "com.shengzhe.disan.xuetangparent.fileprovider" : "com.shengzhe.disan.xuetangteacher.fileprovider";
? ? ? ? ? ? uri = FileProvider.getUriForFile(BaseApplication.getInstance(), pageName, file);
? ? ? ? } else {
? ? ? ? ? ? uri = Uri.fromFile(file);
? ? ? ? }
? ? ? ? return uri;
? ? }
? ? //格式化的模板
? ? private static final String TIME_FORMAT = "_yyyyMMdd_HHmmss";
? ? private static final String SDCARD_DIR = Environment.getExternalStorageDirectory().getPath();
? ? private static String getTimeFormatName(String timeFormatHeader) {
? ? ? ? final Date date = new Date(System.currentTimeMillis());
? ? ? ? //必須要加上單引號
? ? ? ? final SimpleDateFormat dateFormat = new SimpleDateFormat("'" + timeFormatHeader + "'" + TIME_FORMAT, Locale.getDefault());
? ? ? ? return dateFormat.format(date);
? ? }
? ? /**
? ? ?* 創建新的圖片文件
? ? ?*
? ? ?* @param imageUrl
? ? ?* @return
? ? ?*/
? ? public static File getNewFile(String imageUrl) {
? ? ? ? File file;
? ? ? ? if (TextUtils.isEmpty(imageUrl)) {
? ? ? ? ? ? file = new File(Environment.getExternalStorageDirectory(), System.currentTimeMillis() + ".jpg");//filePath 圖片地址
? ? ? ? } else {
? ? ? ? ? ? file = new File(imageUrl);//filePath 圖片地址
? ? ? ? }
? ? ? ? if (!file.exists()) {
? ? ? ? ? ? try {
? ? ? ? ? ? ? ? file.createNewFile();
? ? ? ? ? ? } catch (IOException e) {
? ? ? ? ? ? ? ? // TODO Auto-generated catch block
? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? return file;
? ? }
? ? /**
? ? ?* @param timeFormatHeader 格式化的頭(除去時間部分)
? ? ?* @param extension? ? ? ? 后綴名
? ? ?* @return 返回時間格式化后的文件名
? ? ?*/
? ? public static String getFileNameByTime(String timeFormatHeader, String extension) {
? ? ? ? return getTimeFormatName(timeFormatHeader) + "." + extension;
? ? }
? ? @SuppressWarnings("ResultOfMethodCallIgnored")
? ? private static File createDir(String sdcardDirName) {
? ? ? ? //拼接成SD卡中完整的dir
? ? ? ? final String dir = SDCARD_DIR + "/" + sdcardDirName + "/";
? ? ? ? final File fileDir = new File(dir);
? ? ? ? if (!fileDir.exists()) {
? ? ? ? ? ? fileDir.mkdirs();
? ? ? ? }
? ? ? ? return fileDir;
? ? }
? ? @SuppressWarnings("ResultOfMethodCallIgnored")
? ? public static File createFile(String sdcardDirName, String fileName) {
? ? ? ? return new File(createDir(sdcardDirName), fileName);
? ? }
? ? private static File createFileByTime(String sdcardDirName, String timeFormatHeader, String extension) {
? ? ? ? final String fileName = getFileNameByTime(timeFormatHeader, extension);
? ? ? ? return createFile(sdcardDirName, fileName);
? ? }
? ? //獲取文件的MIME
? ? public static String getMimeType(String filePath) {
? ? ? ? final String extension = getExtension(filePath);
? ? ? ? return MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
? ? }
? ? //獲取文件的后綴名
? ? public static String getExtension(String filePath) {
? ? ? ? String suffix = "";
? ? ? ? final File file = new File(filePath);
? ? ? ? final String name = file.getName();
? ? ? ? final int idx = name.lastIndexOf('.');
? ? ? ? if (idx > 0) {
? ? ? ? ? ? suffix = name.substring(idx + 1);
? ? ? ? }
? ? ? ? return suffix;
? ? }
? ? /**
? ? ?* 保存Bitmap到SD卡中
? ? ?*
? ? ?* @param dir? ? ? 目錄名,只需要寫自己的相對目錄名即可
? ? ?* @param compress 壓縮比例 100是不壓縮,值約小壓縮率越高
? ? ?* @return 返回該文件
? ? ?*/
? ? public static File saveBitmap(Bitmap mBitmap, String dir, int compress) {
? ? ? ? final String sdStatus = Environment.getExternalStorageState();
? ? ? ? // 檢測sd是否可用
? ? ? ? if (!sdStatus.equals(Environment.MEDIA_MOUNTED)) {
? ? ? ? ? ? return null;
? ? ? ? }
? ? ? ? FileOutputStream fos = null;
? ? ? ? BufferedOutputStream bos = null;
? ? ? ? File fileName = createFileByTime(dir, "3rde", "jpg");
? ? ? ? try {
? ? ? ? ? ? fos = new FileOutputStream(fileName);
? ? ? ? ? ? bos = new BufferedOutputStream(fos);
? ? ? ? ? ? mBitmap.compress(Bitmap.CompressFormat.JPEG, compress, bos);// 把數據寫入文件
? ? ? ? } catch (FileNotFoundException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? } finally {
? ? ? ? ? ? try {
? ? ? ? ? ? ? ? if (bos != null) {
? ? ? ? ? ? ? ? ? ? bos.flush();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? if (bos != null) {
? ? ? ? ? ? ? ? ? ? bos.close();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? //關閉流
? ? ? ? ? ? ? ? if (fos != null) {
? ? ? ? ? ? ? ? ? ? fos.flush();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? if (fos != null) {
? ? ? ? ? ? ? ? ? ? fos.close();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? } catch (IOException e) {
? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? refreshDCIM();
? ? ? ? return fileName;
? ? }
? ? public static File writeToDisk(InputStream is, String dir, String name) {
? ? ? ? final File file = FileUtil.createFile(dir, name);
? ? ? ? BufferedInputStream bis = null;
? ? ? ? FileOutputStream fos = null;
? ? ? ? BufferedOutputStream bos = null;
? ? ? ? try {
? ? ? ? ? ? bis = new BufferedInputStream(is);
? ? ? ? ? ? fos = new FileOutputStream(file);
? ? ? ? ? ? bos = new BufferedOutputStream(fos);
? ? ? ? ? ? byte data[] = new byte[1024 * 4];
? ? ? ? ? ? int count;
? ? ? ? ? ? while ((count = bis.read(data)) != -1) {
? ? ? ? ? ? ? ? bos.write(data, 0, count);
? ? ? ? ? ? }
? ? ? ? ? ? bos.flush();
? ? ? ? ? ? fos.flush();
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? } finally {
? ? ? ? ? ? try {
? ? ? ? ? ? ? ? if (bos != null) {
? ? ? ? ? ? ? ? ? ? bos.close();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? if (fos != null) {
? ? ? ? ? ? ? ? ? ? fos.close();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? if (bis != null) {
? ? ? ? ? ? ? ? ? ? bis.close();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? is.close();
? ? ? ? ? ? } catch (IOException e) {
? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? return file;
? ? }
? ? public static File writeToDisk(InputStream is, String dir, String prefix, String extension) {
? ? ? ? final File file = FileUtil.createFileByTime(dir, prefix, extension);
? ? ? ? BufferedInputStream bis = null;
? ? ? ? FileOutputStream fos = null;
? ? ? ? BufferedOutputStream bos = null;
? ? ? ? try {
? ? ? ? ? ? bis = new BufferedInputStream(is);
? ? ? ? ? ? fos = new FileOutputStream(file);
? ? ? ? ? ? bos = new BufferedOutputStream(fos);
? ? ? ? ? ? byte data[] = new byte[1024 * 4];
? ? ? ? ? ? int count;
? ? ? ? ? ? while ((count = bis.read(data)) != -1) {
? ? ? ? ? ? ? ? bos.write(data, 0, count);
? ? ? ? ? ? }
? ? ? ? ? ? bos.flush();
? ? ? ? ? ? fos.flush();
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? } finally {
? ? ? ? ? ? try {
? ? ? ? ? ? ? ? if (bos != null) {
? ? ? ? ? ? ? ? ? ? bos.close();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? if (fos != null) {
? ? ? ? ? ? ? ? ? ? fos.close();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? if (bis != null) {
? ? ? ? ? ? ? ? ? ? bis.close();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? is.close();
? ? ? ? ? ? } catch (IOException e) {
? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? return file;
? ? }
? ? /**
? ? ?* 通知系統刷新系統相冊,使照片展現出來
? ? ?*/
? ? private static void refreshDCIM() {
? ? ? ? if (Build.VERSION.SDK_INT >= 19) {
? ? ? ? ? ? //兼容android4.4版本,只掃描存放照片的目錄
? ? ? ? ? ? MediaScannerConnection.scanFile(BaseApplication.getContext(),
? ? ? ? ? ? ? ? ? ? new String[]{Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getPath()},
? ? ? ? ? ? ? ? ? ? null, null);
? ? ? ? } else {
? ? ? ? ? ? //掃描整個SD卡來更新系統圖庫,當文件很多時用戶體驗不佳,且不適合4.4以上版本
? ? ? ? ? ? BaseApplication.getContext().sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" +
? ? ? ? ? ? ? ? ? ? Environment.getExternalStorageDirectory())));
? ? ? ? }
? ? }
? ? /**
? ? ?* 讀取raw目錄中的文件,并返回為字符串
? ? ?*/
? ? public static String getRawFile(int id) {
? ? ? ? final InputStream is = BaseApplication.getContext().getResources().openRawResource(id);
? ? ? ? final BufferedInputStream bis = new BufferedInputStream(is);
? ? ? ? final InputStreamReader isr = new InputStreamReader(bis);
? ? ? ? final BufferedReader br = new BufferedReader(isr);
? ? ? ? final StringBuilder stringBuilder = new StringBuilder();
? ? ? ? String str;
? ? ? ? try {
? ? ? ? ? ? while ((str = br.readLine()) != null) {
? ? ? ? ? ? ? ? stringBuilder.append(str);
? ? ? ? ? ? }
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? } finally {
? ? ? ? ? ? try {
? ? ? ? ? ? ? ? br.close();
? ? ? ? ? ? ? ? isr.close();
? ? ? ? ? ? ? ? bis.close();
? ? ? ? ? ? ? ? is.close();
? ? ? ? ? ? } catch (IOException e) {
? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? return stringBuilder.toString();
? ? }
? ? public static void setIconFont(String path, TextView textView) {
? ? ? ? final Typeface typeface = Typeface.createFromAsset(BaseApplication.getContext().getAssets(), path);
? ? ? ? textView.setTypeface(typeface);
? ? }
? ? /**
? ? ?* 讀取assets目錄下的文件,并返回字符串
? ? ?*/
? ? public static String getAssetsFile(String name) {
? ? ? ? InputStream is = null;
? ? ? ? BufferedInputStream bis = null;
? ? ? ? InputStreamReader isr = null;
? ? ? ? BufferedReader br = null;
? ? ? ? StringBuilder stringBuilder = null;
? ? ? ? final AssetManager assetManager = BaseApplication.getContext().getAssets();
? ? ? ? try {
? ? ? ? ? ? is = assetManager.open(name);
? ? ? ? ? ? bis = new BufferedInputStream(is);
? ? ? ? ? ? isr = new InputStreamReader(bis);
? ? ? ? ? ? br = new BufferedReader(isr);
? ? ? ? ? ? stringBuilder = new StringBuilder();
? ? ? ? ? ? String str;
? ? ? ? ? ? while ((str = br.readLine()) != null) {
? ? ? ? ? ? ? ? stringBuilder.append(str);
? ? ? ? ? ? }
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? } finally {
? ? ? ? ? ? try {
? ? ? ? ? ? ? ? if (br != null) {
? ? ? ? ? ? ? ? ? ? br.close();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? if (isr != null) {
? ? ? ? ? ? ? ? ? ? isr.close();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? if (bis != null) {
? ? ? ? ? ? ? ? ? ? bis.close();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? if (is != null) {
? ? ? ? ? ? ? ? ? ? is.close();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? assetManager.close();
? ? ? ? ? ? } catch (IOException e) {
? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? if (stringBuilder != null) {
? ? ? ? ? ? return stringBuilder.toString();
? ? ? ? } else {
? ? ? ? ? ? return null;
? ? ? ? }
? ? }
? ? /**
? ? ?* 判斷SD卡是否可用
? ? ?*
? ? ?* @return SD卡可用返回true
? ? ?*/
? ? public static boolean hasSdcard() {
? ? ? ? String status = Environment.getExternalStorageState();
? ? ? ? return Environment.MEDIA_MOUNTED.equals(status);
? ? }
? ? 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)) {
? ? ? ? ? ? final Cursor cursor = context.getContentResolver().query(uri, new String[]{MediaStore.Images.ImageColumns.DATA}, null, null, null);
? ? ? ? ? ? if (null != cursor) {
? ? ? ? ? ? ? ? if (cursor.moveToFirst()) {
? ? ? ? ? ? ? ? ? ? final int index = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
? ? ? ? ? ? ? ? ? ? if (index > -1) {
? ? ? ? ? ? ? ? ? ? ? ? data = cursor.getString(index);
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? cursor.close();
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? return data;
? ? }
? ? /**
? ? ?* 相機拍照保存的文件全路徑
? ? ?*/
? ? public static File getTakePhotoFile() {
? ? ? ? File file = null;
? ? ? ? try {
? ? ? ? ? ? file = new File(Environment.getExternalStorageDirectory(), "takephoto.jpg");
? ? ? ? ? ? if (!file.exists()) {
? ? ? ? ? ? ? ? file.createNewFile();
? ? ? ? ? ? }
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? ? ? return file;
? ? }
? ? /**
? ? ?* 相機拍照保存的文件全路徑(裁剪后的臨時路徑)
? ? ?*/
? ? public static File getTempPhotoFile() {
? ? ? ? File file = null;
? ? ? ? try {
? ? ? ? ? ? file = new File(Environment.getExternalStorageDirectory(), System.currentTimeMillis() + ".jpg");
? ? ? ? ? ? if (!file.exists()) {
? ? ? ? ? ? ? ? file.createNewFile();
? ? ? ? ? ? }
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? ? ? return file;
? ? }
? ? /**
? ? ?* 相機拍照保存的文件全路徑
? ? ?*/
? ? public static String getTakePhotoFileDirectory() {
? ? ? ? String dirs = android.os.Environment.getExternalStorageDirectory().getAbsolutePath();
? ? ? ? File fileDirectory = new File(dirs);
? ? ? ? if (!fileDirectory.exists()) {
? ? ? ? ? ? fileDirectory.mkdirs();
? ? ? ? }
? ? ? ? return dirs;
? ? }
? ? /**
? ? ?* 創建文件
? ? ?*
? ? ?* @param path
? ? ?* @return
? ? ?*/
? ? public static File createDirFile(String path) {
? ? ? ? int pos = path.lastIndexOf("/");
? ? ? ? String dirpath = path.substring(0, pos + 1);
? ? ? ? if (!dirpath.startsWith("/"))
? ? ? ? ? ? dirpath = "/" + dirpath;
? ? ? ? File f = new File(dirpath);
? ? ? ? if (!f.exists())
? ? ? ? ? ? f.mkdirs();
? ? ? ? return new File(path);
? ? }
? ? /**
? ? ?* 通過文件名,判斷指定目錄下是否有改文件
? ? ?*
? ? ?* @param filename
? ? ?*/
? ? public static File isExitByFileName(String path, String filename) {
? ? ? ? File isExitFile = null;
? ? ? ? File dir = new File(path);
? ? ? ? File[] listFiles = dir.listFiles();
? ? ? ? if (listFiles != null) {
? ? ? ? ? ? for (File file : listFiles) {
? ? ? ? ? ? ? ? if (file.getName().equals(filename)) {
? ? ? ? ? ? ? ? ? ? isExitFile = file;
? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? return isExitFile;
? ? }
? ? /**
? ? ?* 輸入流轉文件并保存到本地
? ? ?*
? ? ?* @param is? ? ? ?文件輸入流
? ? ?* @param savePath 保存的路徑
? ? ?* @param fileName 文件名
? ? ?* @return
? ? ?*/
? ? public static File InputStreamToFile(InputStream is, String savePath, String fileName) {
? ? ? ? try {
? ? ? ? ? ? File dir = new File(savePath);
? ? ? ? ? ? if (!dir.exists()) {
? ? ? ? ? ? ? ? dir.mkdirs();
? ? ? ? ? ? }
? ? ? ? ? ? File outFile = new File(dir + "/" + fileName);
? ? ? ? ? ? if (outFile != null) {
? ? ? ? ? ? ? ? FileOutputStream fos = new FileOutputStream(outFile);
? ? ? ? ? ? ? ? byte[] buffer = new byte[1024 * 10];
? ? ? ? ? ? ? ? int count = 0;
? ? ? ? ? ? ? ? while ((count = is.read(buffer)) != -1) {
? ? ? ? ? ? ? ? ? ? fos.write(buffer, 0, count);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? is.close();
? ? ? ? ? ? ? ? fos.flush();
? ? ? ? ? ? ? ? fos.close();
? ? ? ? ? ? ? ? return outFile;
? ? ? ? ? ? }
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? ? ? return null;
? ? }
? ? /**
? ? ?* create the targer file's dir
? ? ?*
? ? ?* @param path the file's absolute path
? ? ?*/
? ? public static void createDirs(String path) {
? ? ? ? path = path.substring(0, path.lastIndexOf("/") + 1);
? ? ? ? File dir = new File(path);
? ? ? ? if (!dir.exists()) {
? ? ? ? ? ? dir.mkdirs();
? ? ? ? }
? ? }
? ? /***
? ? ?* 刪除指定目錄下得所有文件
? ? ?* @param dirPath
? ? ?*/
? ? public static boolean clearAllFile(String dirPath) {
? ? ? ? File file = new File(dirPath);
? ? ? ? if (file != null && file.exists()) {
? ? ? ? ? ? if (file.isFile()) {
? ? ? ? ? ? ? ? return file.delete();
? ? ? ? ? ? } else if (file.isDirectory()) {
? ? ? ? ? ? ? ? File[] listFiles = file.listFiles();
? ? ? ? ? ? ? ? for (int i = 0; listFiles != null && i < listFiles.length; i++) {
? ? ? ? ? ? ? ? ? ? if (listFiles[i].isFile()) {
? ? ? ? ? ? ? ? ? ? ? ? if (!listFiles[i].delete()) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? LogUtils.d("Delete file failed!" + dirPath);
? ? ? ? ? ? ? ? ? ? ? ? ? ? return false;
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? ? ? ? ? if (!clearAllFile(listFiles[i].getPath())) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? return false;
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? LogUtils.d("Delete file----file is not exists----" + dirPath);
? ? ? ? return true;
? ? }
? ? /*****
? ? ?* 刪除指定路徑APK文件
? ? ?* @param path
? ? ?*/
? ? public static void rmoveAPKFile(String path) {
? ? ? ? File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), path.substring(path.lastIndexOf("/")));
? ? ? ? if (file.exists()) {
? ? ? ? ? ? file.delete();
? ? ? ? }
? ? ? ? if (!file.exists())
? ? ? ? ? ? LogUtils.d("安裝文件刪除成功");
? ? }
? ? /**
? ? ?* 創建目錄
? ? ?*
? ? ?* @param path
? ? ?* @return
? ? ?*/
? ? public static File createDirByPath(String path) {
? ? ? ? File file = new File(path);
? ? ? ? if (file != null && !file.exists()) {
? ? ? ? ? ? file.mkdirs();
? ? ? ? }
? ? ? ? return file;
? ? }
? ? /**
? ? ?* 復制文件到指定目錄
? ? ?*
? ? ?* @param is
? ? ?* @param dirPath
? ? ?* @param fileName
? ? ?*/
? ? public static File copyFile(InputStream is, String dirPath, String fileName) {
? ? ? ? try {
? ? ? ? ? ? if (is != null) {
? ? ? ? ? ? ? ? File file = new File(createDirByPath(dirPath), fileName);
? ? ? ? ? ? ? ? FileOutputStream fos = new FileOutputStream(file);
? ? ? ? ? ? ? ? byte[] buffer = new byte[1024 * 100];
? ? ? ? ? ? ? ? int len = 0;
? ? ? ? ? ? ? ? while ((len = is.read(buffer)) != -1) {
? ? ? ? ? ? ? ? ? ? fos.write(buffer, 0, len);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? is.close();
? ? ? ? ? ? ? ? fos.flush();
? ? ? ? ? ? ? ? fos.close();
? ? ? ? ? ? ? ? return file;
? ? ? ? ? ? }
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? return null;
? ? ? ? }
? ? ? ? return null;
? ? }
? ? /**
? ? ?* @param uri The Uri to check.
? ? ?* @return Whether the Uri authority is ExternalStorageProvider.
? ? ?*/
? ? public static boolean isExternalStorageDocument(Uri uri) {
? ? ? ? return "com.android.externalstorage.documents".equals(uri.getAuthority());
? ? }
? ? /**
? ? ?* @param uri The Uri to check.
? ? ?* @return Whether the Uri authority is DownloadsProvider.
? ? ?*/
? ? public static boolean isDownloadsDocument(Uri uri) {
? ? ? ? return "com.android.providers.downloads.documents".equals(uri.getAuthority());
? ? }
? ? /**
? ? ?* @param uri The Uri to check.
? ? ?* @return Whether the Uri authority is MediaProvider.
? ? ?*/
? ? public static boolean isMediaDocument(Uri uri) {
? ? ? ? return "com.android.providers.media.documents".equals(uri.getAuthority());
? ? }
? ? /*******
? ? ?* 相冊選取圖片得到的Uri是Content Uri而拍照后使用的是文件路徑生成的File Uri,
? ? ?* 看來問題就是出在這里,并不是說我們app的targetSDKVersion不是24就可以使用File Uri,
? ? ?* 但是photos app的targetSdkVersion可能是24導致了它接受了File Uri而崩潰,
? ? ?* 那么我們需要做的就是把File Uri換成Content Uri。這里需要提的是,
? ? ?* 直接按照這里的做法去更換Content Uri并不能生效,會提示“Can not edit image under 50*50 pixels”的錯誤toast提示,
? ? ?* 其實是photos app找不到Content Uri傳進去的圖片文件。那么我們需要換一種方式去更換Content Uri,
? ? ?* 我們在stackoverflow上面找到更換Content Uri的方法,需要注意的是不是所有的File Uri都可以轉換成Content Uri,應該是多媒體相關的文件才可以。
? ? ?* @return
? ? ?* 參考 http://www.jianshu.com/p/c73b959b6bcf
? ? ?*/
? ? public static Uri getImageContentUri(String filePath) {
? ? ? ? Cursor cursor = BaseApplication.getContext().getContentResolver().query(
? ? ? ? ? ? ? ? MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
? ? ? ? ? ? ? ? new String[]{MediaStore.Images.Media._ID},
? ? ? ? ? ? ? ? MediaStore.Images.Media.DATA + "=? ",
? ? ? ? ? ? ? ? new String[]{filePath}, null);
? ? ? ? if (cursor != null && cursor.moveToFirst()) {
? ? ? ? ? ? int id = cursor.getInt(cursor
? ? ? ? ? ? ? ? ? ? .getColumnIndex(MediaStore.MediaColumns._ID));
? ? ? ? ? ? Uri baseUri = Uri.parse("content://media/external/images/media");
? ? ? ? ? ? return Uri.withAppendedPath(baseUri, "" + id);
? ? ? ? } else {
? ? ? ? ? ? if (new File(filePath).exists()) {
? ? ? ? ? ? ? ? ContentValues values = new ContentValues();
? ? ? ? ? ? ? ? values.put(MediaStore.Images.Media.DATA, filePath);
? ? ? ? ? ? ? ? return BaseApplication.getContext().getContentResolver().insert(
? ? ? ? ? ? ? ? ? ? ? ? MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? return null;
? ? ? ? ? ? }
? ? ? ? }
? ? }
? ? /****
? ? ?* 讀取Asset中的文件
? ? ?* @param assetManager
? ? ?* @param path
? ? ?* @return
? ? ?*/
? ? public static String getAssetFileToStr(AssetManager assetManager, String path) {
? ? ? ? BufferedReader bufferedReader = null;
? ? ? ? StringBuilder result = new StringBuilder();
? ? ? ? try {
? ? ? ? ? ? bufferedReader = new BufferedReader(new InputStreamReader(assetManager.open(path), "UTF-8"));
? ? ? ? ? ? for (String ignored = null; (ignored = bufferedReader.readLine()) != null; ) {
? ? ? ? ? ? ? ? result.append(ignored);
? ? ? ? ? ? }
? ? ? ? } catch (IOException var13) {
? ? ? ? ? ? return "";
? ? ? ? } finally {
? ? ? ? ? ? if (bufferedReader != null) {
? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? bufferedReader.close();
? ? ? ? ? ? ? ? } catch (IOException var12) {
? ? ? ? ? ? ? ? ? ? ;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? return result.toString().trim();
? ? }
? ? /******
? ? ?* 根據URI獲取文件絕對路徑
? ? ?* @param contentUri
? ? ?* @return
? ? ?* liukui 2017/05/19
? ? ?*/
? ? public static String getRealPathFromURI(Uri contentUri) {
? ? ? ? if (contentUri == null) return null;
? ? ? ? int sdkVersion = Build.VERSION.SDK_INT;
? ? ? ? if (sdkVersion < 11) {
? ? ? ? ? ? // SDK < Api11
? ? ? ? ? ? return getRealPathFromUri_BelowApi11(contentUri);
? ? ? ? }
? ? ? ? if (sdkVersion < 19) {
? ? ? ? ? ? // SDK > 11 && SDK < 19
? ? ? ? ? ? return getRealPathFromUri_Api11To18(contentUri);
? ? ? ? }
? ? ? ? // SDK > 19
? ? ? ? return getRealPathFromUri_AboveApi19(contentUri);
? ? }
? ? /**
? ? ?* 適配api19以上,根據uri獲取圖片的絕對路徑
? ? ?* liukui 2017/05/19
? ? ?*/
? ? @SuppressLint("NewApi")
? ? private static String getRealPathFromUri_AboveApi19(Uri uri) {
? ? ? ? if (DocumentsContract.isDocumentUri(BaseApplication.getInstance(), uri)) { // 【DocumentProvider】
? ? ? ? ? ? if (isExternalStorageDocument(uri)) { // 【ExternalStorageProvider】
? ? ? ? ? ? ? ? String docId = DocumentsContract.getDocumentId(uri);
? ? ? ? ? ? ? ? String[] split = docId.split(":");
? ? ? ? ? ? ? ? String type = split[0];
? ? ? ? ? ? ? ? if ("primary".equalsIgnoreCase(type))
? ? ? ? ? ? ? ? ? ? return Environment.getExternalStorageDirectory() + "/" + split[1];
? ? ? ? ? ? } else if (isDownloadsDocument(uri)) { // 【DownloadsProvider】
? ? ? ? ? ? ? ? String id = DocumentsContract.getDocumentId(uri);
? ? ? ? ? ? ? ? Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
? ? ? ? ? ? ? ? return getDataColumn(contentUri, null, null);
? ? ? ? ? ? } else if (isMediaDocument(uri)) { // 【MediaProvider】
? ? ? ? ? ? ? ? String docId = DocumentsContract.getDocumentId(uri);
? ? ? ? ? ? ? ? String[] split = docId.split(":");
? ? ? ? ? ? ? ? String type = split[0];
? ? ? ? ? ? ? ? Uri contentUri = null;
? ? ? ? ? ? ? ? if ("image".equals(type)) contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
? ? ? ? ? ? ? ? else if ("video".equals(type))
? ? ? ? ? ? ? ? ? ? contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
? ? ? ? ? ? ? ? else if ("audio".equals(type))
? ? ? ? ? ? ? ? ? ? contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
? ? ? ? ? ? ? ? String selection = "_id=?";
? ? ? ? ? ? ? ? String[] selectionArgs = new String[]{split[1]};
? ? ? ? ? ? ? ? return getDataColumn(contentUri, selection, selectionArgs);
? ? ? ? ? ? }
? ? ? ? } else if ("content".equalsIgnoreCase(uri.getScheme())) { // 【MediaStore (and general)】
? ? ? ? ? ? return getDataColumn(uri, null, null);
? ? ? ? } else if ("file".equalsIgnoreCase(uri.getScheme())) { // 【File】
? ? ? ? ? ? return uri.getPath();
? ? ? ? }
? ? ? ? return "";
? ? }
? ? /**
? ? ?* Get the value of the data column for this Uri. This is useful for MediaStore Uris, and other file-based ContentProviders.
? ? ?*
? ? ?* @param uri? ? ? ? ? ?The Uri to query.
? ? ?* @param selection? ? ?(Optional) Filter used in the query.
? ? ?* @param selectionArgs (Optional) Selection arguments used in the query.
? ? ?* @return The value of the _data column, which is typically a file path.
? ? ?*/
? ? public static String getDataColumn(Uri uri, String selection, String[] selectionArgs) {
? ? ? ? Cursor cursor = null;
? ? ? ? String column = "_data";
? ? ? ? String[] projection = {column};
? ? ? ? String result = "";
? ? ? ? cursor = BaseApplication.getContext().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) {
? ? ? ? ? ? ? ? ? ? result = cursor.getString(index);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? cursor.close();
? ? ? ? }
? ? ? ? return result;
? ? }
? ? /**
? ? ?* 適配api11-api18,根據uri獲取圖片的絕對路徑
? ? ?* liukui 2017/05/19
? ? ?*/
? ? private static String getRealPathFromUri_Api11To18(Uri uri) {
? ? ? ? String filePath = null;
? ? ? ? String[] projection = {MediaStore.Images.Media.DATA};
? ? ? ? CursorLoader loader = new CursorLoader(BaseApplication.getInstance(), uri, projection, null,
? ? ? ? ? ? ? ? null, null);
? ? ? ? Cursor cursor = loader.loadInBackground();
? ? ? ? if (cursor == null)
? ? ? ? ? ? return "";
? ? ? ? cursor.moveToFirst();
? ? ? ? filePath = cursor.getString(cursor.getColumnIndex(projection[0]));
? ? ? ? cursor.close();
? ? ? ? return filePath;
? ? }
? ? /**
? ? ?* 適配api11以下(不包括api11),根據uri獲取圖片的絕對路徑
? ? ?* liukui 2017/05/19
? ? ?*/
? ? private static String getRealPathFromUri_BelowApi11(Uri uri) {
? ? ? ? String filePath = null;
? ? ? ? String[] projection = {MediaStore.Images.Media.DATA};
? ? ? ? Cursor cursor = BaseApplication.getInstance().getContentResolver().query(uri, projection,
? ? ? ? ? ? ? ? null, null, null);
? ? ? ? if (cursor == null)
? ? ? ? ? ? return "";
? ? ? ? cursor.moveToFirst();
? ? ? ? filePath = cursor.getString(cursor.getColumnIndex(projection[0]));
? ? ? ? cursor.close();
? ? ? ? return filePath;
? ? }
? ? public static void DeleteFile(String filePath) {
? ? ? ? File file = new File(filePath);
? ? ? ? if (file.exists()) {
? ? ? ? ? ? if (file.getAbsoluteFile().delete()) {
? ? ? ? ? ? ? ? LogUtils.d(file.getName() + " 刪除成功!");
? ? ? ? ? ? }
? ? ? ? }
? ? }
? ? /**
? ? ?* 打開文件
? ? ?* 兼容7.0
? ? ?*
? ? ?* @param context? ? ?activity
? ? ?* @param file? ? ? ? File
? ? ?* @param contentType 文件類型如:文本(text/html)
? ? ?*? ? ? ? ? ? ? ? ? ? 當手機中沒有一個app可以打開file時會拋ActivityNotFoundException
? ? ?*/
? ? public static void startActionFile(Context context, File file, String contentType) throws ActivityNotFoundException {
? ? ? ? if (context == null) {
? ? ? ? ? ? return;
? ? ? ? }
? ? ? ? Intent intent = new Intent(Intent.ACTION_VIEW);
? ? ? ? intent.addCategory(Intent.CATEGORY_DEFAULT);
? ? ? ? intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
? ? ? ? intent.setFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);//增加讀寫權限
? ? ? ? intent.setDataAndType(getUriFromFile(), contentType);
? ? ? ? if (!(context instanceof Activity)) {
? ? ? ? ? ? intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
? ? ? ? }
? ? ? ? context.startActivity(intent);
? ? }
? ? public static Uri getUriFromFile() {
? ? ? ? File file = getTakePhotoFile();
? ? ? ? if (file == null) {
? ? ? ? ? ? throw new NullPointerException();
? ? ? ? }
? ? ? ? Uri uri;
? ? ? ? if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
? ? ? ? ? ? //uri = FileProvider.getUriForFile(BaseApplication.getInstance(), BuildConfig.APPLICATION_ID + ".fileprovider", file);
? ? ? ? ? ? String pageName = BaseApplication.getInstance().getAppFrom().equals(BaseStringUtils.AppFromParent) ? "com.shengzhe.disan.xuetangparent.fileprovider" : "com.shengzhe.disan.xuetangteacher.fileprovider";
? ? ? ? ? ? uri = FileProvider.getUriForFile(BaseApplication.getInstance(), pageName, file);
? ? ? ? } else {
? ? ? ? ? ? uri = Uri.fromFile(file);
? ? ? ? }
? ? ? ? return uri;
? ? }
總結
- 上一篇: Activity管理
- 下一篇: 如何正确地选择和使用家居装饰品?