package org.apache.cordova.camera; import android.net.Uri; import android.os.Build; import android.os.Environment; import android.support.v4.content.FileProvider; import java.io.File; /* * This class exists because Andorid FilesProvider doesn't work on Android 4.4.4 and below and throws * weird errors. I'm not sure why writing to shared cache directories is somehow verboten, but it is * and this error is irritating for a Compatibility library to have. * */ public class CordovaUri { private Uri androidUri; private String fileName; private Uri fileUri; /* * We always expect a FileProvider string to be passed in for the file that we create * */ CordovaUri (Uri inputUri) { //Determine whether the file is a content or file URI if(inputUri.getScheme().equals("content")) { androidUri = inputUri; fileName = getFileNameFromUri(androidUri); fileUri = Uri.parse("file://" + fileName); } else { fileUri = inputUri; fileName = FileHelper.stripFileProtocol(inputUri.toString()); } } public Uri getFileUri() { return fileUri; } public String getFilePath() { return fileName; } /* * This only gets called by takePicture */ public Uri getCorrectUri() { if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) return androidUri; else return fileUri; } /* * This is dirty, but it does the job. * * Since the FilesProvider doesn't really provide you a way of getting a URL from the file, * and since we actually need the Camera to create the file for us most of the time, we don't * actually write the file, just generate the location based on a timestamp, we need to get it * back from the Intent. * * However, the FilesProvider preserves the path, so we can at least write to it from here, since * we own the context in this case. */ private String getFileNameFromUri(Uri uri) { String fullUri = uri.toString(); String partial_path = fullUri.split("external_files")[1]; File external_storage = Environment.getExternalStorageDirectory(); String path = external_storage.getAbsolutePath() + partial_path; return path; } }