/* * Copyright (C) 2015-2017 Emanuel Moecklin * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.onegravity.rteditor.media; import java.io.File; import java.util.Calendar; import com.onegravity.rteditor.utils.io.FilenameUtils; import android.content.Context; import android.database.Cursor; import android.net.Uri; import android.provider.MediaStore.MediaColumns; import android.webkit.MimeTypeMap; import com.onegravity.rteditor.utils.Helper; /** * Collection of utility functions used in the media package */ public class MediaUtils { /** * Creates a file with a non-conflicting file name in a specified folder based on an existing file name. * * @param targetFolder The target folder (e.g. /sdcard/Android/data) * @param originalFile The source file including the path (e.g. /sdcard/image.jpg) * @param mimeType If the originalFile has no extension (e.g. for files provided by picasa) we use the mime type * to determine the file extension * @return The non-conflicting file name in targetFolder (e.g. /sdcard/Android/data/158867324_201308071234568.jpg) */ public static File createUniqueFile(File targetFolder, String originalFile, boolean keepOriginal) { String mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(originalFile); return createUniqueFile(targetFolder, originalFile, mimeType, keepOriginal); } public static File createUniqueFile(File targetFolder, String originalFile, String mimeType, boolean keepOriginal) { /* * We try to get the extension from the file name first. * If that fails (e.g. for images provided by the picasa content provider) * we use the mime type to determine the extension. * The extension is important to be able to determine the correct content type * once we create a MIME message. */ String extension = FilenameUtils.getExtension(originalFile); if (isNullOrEmpty(extension)) { extension = MimeTypeMap.getSingleton().getExtensionFromMimeType(mimeType); } String random = Long.toString(Math.round(Math.random() * Integer.MAX_VALUE)); // random part long timestamp = Calendar.getInstance().getTimeInMillis(); // time stamp if (keepOriginal) { String baseName = FilenameUtils.getBaseName(originalFile); return new File(targetFolder + File.separator + baseName + "_" + random + "_" + timestamp + "." + extension); } else { return new File(targetFolder + File.separator + random + "_" + timestamp + "." + extension); } } /** * Creates a file Uri for a file defined by its absolute path. * The method can handle the case of an absolute path (e.g. /data/data....) * and a Uri path containing the file:// scheme (e.g. file:///data/data...) */ public static Uri createFileUri(String path) { if (path.startsWith("file://")) { return Uri.parse(path); } return Uri.fromFile(new File(path)); } /** * Retrieve local file path for an arbitrary Uri * * @throws IllegalArgumentException If the uri is null or we can't resolve the uri to an absolute file path * (meaning the uri isn't valid) */ public static String determineOriginalFile(Context context, Uri uri) throws IllegalArgumentException { String originalFile = null; if (uri != null) { // Picasa on Android >= 3.0 or other files using content providers if (uri.getScheme().startsWith("content")) { originalFile = getPathFromUri(context, uri); } // Picasa on Android < 3.0 if (uri.toString().matches("https?://\\w+\\.googleusercontent\\.com/.+")) { originalFile = uri.toString(); } // local storage if (uri.getScheme().startsWith("file")) { originalFile = uri.toString().substring(7); } if (isNullOrEmpty(originalFile)) { throw new IllegalArgumentException("File path was null"); } } else { throw new IllegalArgumentException("Image Uri was null!"); } return originalFile; } private static String getPathFromUri(Context context, Uri imageUri) { String filePath = ""; if (imageUri.toString().startsWith("content://com.android.gallery3d.provider")) { imageUri = Uri.parse(imageUri.toString().replace("com.android.gallery3d", "com.google.android.gallery3d")); } Cursor cursor = null; try { String column = MediaColumns.DATA; String[] proj = {MediaColumns.DATA}; cursor = context.getContentResolver().query(imageUri, proj, null, null, null); cursor.moveToFirst(); if (imageUri.toString().startsWith("content://com.google.android.gallery3d")) { filePath = imageUri.toString(); } else { filePath = cursor.getString(cursor.getColumnIndexOrThrow(column)); } } catch (Exception ignore) { // Google Drive content provider throws an exception that we ignore // content://com.google.android.apps.docs.storage } finally { Helper.closeQuietly(cursor); } if (isNullOrEmpty(filePath) || !new File(filePath).exists() || imageUri.toString().startsWith("content://com.google.android.gallery3d")) { filePath = imageUri.toString(); } return filePath; } private static boolean isNullOrEmpty(String string) { return string == null || string.length() == 0; } }