Convert file: Uri to File in Android - android

What is the easiest way to convert from an android.net.Uri object which holds a file: type to a java.io.File object in Android?
I tried the following but it doesn't work:
File file = new File(Environment.getExternalStorageDirectory(), "read.me");
Uri uri = Uri.fromFile(file);
File auxFile = new File(uri.toString());
assertEquals(file.getAbsolutePath(), auxFile.getAbsolutePath());

What you want is...
new File(uri.getPath());
... and not...
new File(uri.toString());
Notes
For an android.net.Uri object which is named uri and created exactly as in the question, uri.toString() returns a String in the format "file:///mnt/sdcard/myPicture.jpg", whereas uri.getPath() returns a String in the format "/mnt/sdcard/myPicture.jpg".
I understand that there are nuances to file storage in Android. My intention in this answer is to answer exactly what the questioner asked and not to get into the nuances.

use
InputStream inputStream = getContentResolver().openInputStream(uri);
directly and copy the file. Also see:
https://developer.android.com/guide/topics/providers/document-provider.html

After searching for a long time this is what worked for me:
File file = new File(getPath(uri));
public String getPath(Uri uri)
{
String[] projection = { MediaStore.Images.Media.DATA };
Cursor cursor = getContentResolver().query(uri, projection, null, null, null);
if (cursor == null) return null;
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
String s=cursor.getString(column_index);
cursor.close();
return s;
}

Android + Kotlin
Add dependency for Kotlin Android extensions:
implementation 'androidx.core:core-ktx:{latestVersion}'
Get file from uri:
uri.toFile()

Best Solution
Create one simple FileUtil class & use to create, copy and rename the file
I used uri.toString() and uri.getPath() but not work for me.
I finally found this solution.
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.provider.OpenableColumns;
import android.util.Log;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class FileUtil {
private static final int EOF = -1;
private static final int DEFAULT_BUFFER_SIZE = 1024 * 4;
private FileUtil() {
}
public static File from(Context context, Uri uri) throws IOException {
InputStream inputStream = context.getContentResolver().openInputStream(uri);
String fileName = getFileName(context, uri);
String[] splitName = splitFileName(fileName);
File tempFile = File.createTempFile(splitName[0], splitName[1]);
tempFile = rename(tempFile, fileName);
tempFile.deleteOnExit();
FileOutputStream out = null;
try {
out = new FileOutputStream(tempFile);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
if (inputStream != null) {
copy(inputStream, out);
inputStream.close();
}
if (out != null) {
out.close();
}
return tempFile;
}
private static String[] splitFileName(String fileName) {
String name = fileName;
String extension = "";
int i = fileName.lastIndexOf(".");
if (i != -1) {
name = fileName.substring(0, i);
extension = fileName.substring(i);
}
return new String[]{name, extension};
}
private static String getFileName(Context context, Uri uri) {
String result = null;
if (uri.getScheme().equals("content")) {
Cursor cursor = context.getContentResolver().query(uri, null, null, null, null);
try {
if (cursor != null && cursor.moveToFirst()) {
result = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (cursor != null) {
cursor.close();
}
}
}
if (result == null) {
result = uri.getPath();
int cut = result.lastIndexOf(File.separator);
if (cut != -1) {
result = result.substring(cut + 1);
}
}
return result;
}
private static File rename(File file, String newName) {
File newFile = new File(file.getParent(), newName);
if (!newFile.equals(file)) {
if (newFile.exists() && newFile.delete()) {
Log.d("FileUtil", "Delete old " + newName + " file");
}
if (file.renameTo(newFile)) {
Log.d("FileUtil", "Rename file to " + newName);
}
}
return newFile;
}
private static long copy(InputStream input, OutputStream output) throws IOException {
long count = 0;
int n;
byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
while (EOF != (n = input.read(buffer))) {
output.write(buffer, 0, n);
count += n;
}
return count;
}
}
Use FileUtil class in your code
try {
File file = FileUtil.from(MainActivity.this,fileUri);
Log.d("file", "File...:::: uti - "+file .getPath()+" file -" + file + " : " + file .exists());
} catch (IOException e) {
e.printStackTrace();
}

EDIT: Sorry, I should have tested better before. This should work:
new File(new URI(androidURI.toString()));
URI is java.net.URI.

None of this works for me. I found this to be the working solution. But my case is specific to images.
String[] filePathColumn = { MediaStore.Images.Media.DATA };
Cursor cursor = getActivity().getContentResolver().query(uri, filePathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String filePath = cursor.getString(columnIndex);
cursor.close();

With Kotlin it is even easier:
val file = File(uri.path)
Or if you are using Kotlin extensions for Android:
val file = uri.toFile()
UPDATE:
For images it return "Uri lacks 'file' scheme: content://"
Thanks for comment

One other way to reach that is create a Temporary File. to do that:
fun createTmpFileFromUri(context: Context, uri: Uri, fileName: String): File? {
return try {
val stream = context.contentResolver.openInputStream(uri)
val file = File.createTempFile(fileName, "", context.cacheDir)
org.apache.commons.io.FileUtils.copyInputStreamToFile(stream,file)
file
} catch (e: Exception) {
e.printStackTrace()
null
}
}
We use Apache Commons library FileUtils class. For adding it to your project:
implementation "commons-io:commons-io:2.7"
Note that MAKE SURE call to file.delete() after usage.
for more information checkout Documents.

If you have a Uri that conforms to the DocumentContract then you probably don't want to use File.
If you are on kotlin, use DocumentFile to do stuff you would in the old World use File for, and use ContentResolver to get streams.
Everything else is pretty much guaranteed to break.

#CommonsWare explained all things quite well. And we really should use the solution he proposed.
By the way, only information we could rely on when querying ContentResolver is a file's name and size as mentioned here:
Retrieving File Information | Android developers
As you could see there is an interface OpenableColumns that contains only two fields: DISPLAY_NAME and SIZE.
In my case I was need to retrieve EXIF information about a JPEG image and rotate it if needed before sending to a server. To do that I copied a file content into a temporary file using ContentResolver and openInputStream()

For this case, especially on Android, the way going for bytes is usually faster.
With this, I solved it by setting up a class FileHelper which is given the responsibility to deal with reading/writing bytes from/to file through stream and a class UriHelper which is given the responsibility to figure out path of Uri and permission.
As far as it's knew generally, string.getBytes((charset == null) ? DEFAULT_CHARSET:charset) can help us to transfer string you want to bytes you need.
How to let UriHelper and FileHelper you to copy a picture noted by Uri into a file, you can run:
FileHelper.getInstance().copy(UriHelper.getInstance().toFile(uri_of_a_picture)
, FileHelper.getInstance().createExternalFile(null, UriHelper.getInstance().generateFileNameBasedOnTimeStamp()
+ UriHelper.getInstance().getFileName(uri_of_a_picture, context), context)
);
about my UriHelper:
public class UriHelper {
private static UriHelper INSTANCE = new UriHelper();
public static UriHelper getInstance() {
return INSTANCE;
}
#SuppressLint("SimpleDateFormat")
public String generateFileNameBasedOnTimeStamp() {
return new SimpleDateFormat("yyyyMMdd_hhmmss").format(new Date()) + ".jpeg";
}
/**
* if uri.getScheme.equals("content"), open it with a content resolver.
* if the uri.Scheme.equals("file"), open it using normal file methods.
*/
//
public File toFile(Uri uri) {
if (uri == null) return null;
Logger.d(">>> uri path:" + uri.getPath());
Logger.d(">>> uri string:" + uri.toString());
return new File(uri.getPath());
}
public DocumentFile toDocumentFile(Uri uri) {
if (uri == null) return null;
Logger.d(">>> uri path:" + uri.getPath());
Logger.d(">>> uri string:" + uri.toString());
return DocumentFile.fromFile(new File(uri.getPath()));
}
public Uri toUri(File file) {
if (file == null) return null;
Logger.d(">>> file path:" + file.getAbsolutePath());
return Uri.fromFile(file); //returns an immutable URI reference representing the file
}
public String getPath(Uri uri, Context context) {
if (uri == null) return null;
if (uri.getScheme() == null) return null;
Logger.d(">>> uri path:" + uri.getPath());
Logger.d(">>> uri string:" + uri.toString());
String path;
if (uri.getScheme().equals("content")) {
//Cursor cursor = context.getContentResolver().query(uri, new String[] {MediaStore.Images.ImageColumns.DATA}, null, null, null);
Cursor cursor = context.getContentResolver().query(uri, null, null, null, null);
if (cursor == null) {
Logger.e("!!! cursor is null");
return null;
}
if (cursor.getCount() >= 0) {
Logger.d("... the numbers of rows:" + cursor.getCount()
+ "and the numbers of columns:" + cursor.getColumnCount());
if (cursor.isBeforeFirst()) {
while (cursor.moveToNext()) {
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i<cursor.getColumnCount(); i++) {
stringBuilder.append("... iterating cursor.getString(" + i +"(" + cursor.getColumnName(i) + ")):" + cursor.getString(i));
stringBuilder.append("\n");
}
Logger.d(stringBuilder.toString());
}
} else {
cursor.moveToFirst();
do {
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i<cursor.getColumnCount(); i++) {
stringBuilder.append("... iterating cursor.getString(" + i +"(" + cursor.getColumnName(i) + ")):" + cursor.getString(i));
stringBuilder.append("\n");
}
Logger.d(stringBuilder.toString());
} while (cursor.moveToNext());
}
path = uri.getPath();
cursor.close();
Logger.d("... content scheme:" + uri.getScheme() + " and return:" + path);
return path;
} else {
path = uri.getPath();
Logger.d("... content scheme:" + uri.getScheme()
+ " but the numbers of rows in the cursor is < 0:" + cursor.getCount()
+ " and return:" + path);
return path;
}
} else {
path = uri.getPath();
Logger.d("... not content scheme:" + uri.getScheme() + " and return:" + path);
return path;
}
}
public String getFileName(Uri uri, Context context) {
if (uri == null) return null;
if (uri.getScheme() == null) return null;
Logger.d(">>> uri path:" + uri.getPath());
Logger.d(">>> uri string:" + uri.toString());
String path;
if (uri.getScheme().equals("content")) {
//Cursor cursor = context.getContentResolver().query(uri, new String[] {MediaStore.Images.ImageColumns.DATA}, null, null, null);
Cursor cursor = context.getContentResolver().query(uri, null, null, null, null);
if (cursor == null) {
Logger.e("!!! cursor is null");
return null;
}
if (cursor.getCount() >= 0) {
Logger.d("... the numbers of rows:" + cursor.getCount()
+ "and the numbers of columns:" + cursor.getColumnCount());
if (cursor.isBeforeFirst()) {
while (cursor.moveToNext()) {
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i<cursor.getColumnCount(); i++) {
stringBuilder.append("... iterating cursor.getString(" + i +"(" + cursor.getColumnName(i) + ")):" + cursor.getString(i));
stringBuilder.append("\n");
}
Logger.d(stringBuilder.toString());
}
} else {
cursor.moveToFirst();
do {
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i<cursor.getColumnCount(); i++) {
stringBuilder.append("... iterating cursor.getString(" + i +"(" + cursor.getColumnName(i) + ")):" + cursor.getString(i));
stringBuilder.append("\n");
}
Logger.d(stringBuilder.toString());
} while (cursor.moveToNext());
}
cursor.moveToFirst();
path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.ImageColumns.DISPLAY_NAME));
cursor.close();
Logger.d("... content scheme:" + uri.getScheme() + " and return:" + path);
return path;
} else {
path = uri.getLastPathSegment();
Logger.d("... content scheme:" + uri.getScheme()
+ " but the numbers of rows in the cursor is < 0:" + cursor.getCount()
+ " and return:" + path);
return path;
}
} else {
path = uri.getLastPathSegment();
Logger.d("... not content scheme:" + uri.getScheme() + " and return:" + path);
return path;
}
}
}
about my FileHelper:
public class FileHelper {
private static final String DEFAULT_DIR_NAME = "AmoFromTaiwan";
private static final int DEFAULT_BUFFER_SIZE = 1024;
private static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
private static final int EOF = -1;
private static FileHelper INSTANCE = new FileHelper();
public static FileHelper getInstance() {
return INSTANCE;
}
private boolean isExternalStorageWritable(Context context) {
/*
String state = Environment.getExternalStorageState();
return Environment.MEDIA_MOUNTED.equals(state);
*/
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (context.checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
return true;
} else {
Logger.e("!!! checkSelfPermission() not granted");
return false;
}
} else { //permission is automatically granted on sdk<23 upon installation
return true;
}
}
private boolean isExternalStorageReadable(Context context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (context.checkSelfPermission(android.Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
return true;
} else {
Logger.e("!!! checkSelfPermission() not granted");
return false;
}
} else { //permission is automatically granted on sdk<23 upon installation
return true;
}
}
#SuppressLint("SimpleDateFormat")
private String generateFileNameBasedOnTimeStamp() {
return new SimpleDateFormat("yyyyMMdd_hhmmss").format(new Date()) + ".jpeg";
}
public File createExternalFile(String dir_name, String file_name, Context context) {
String dir_path;
String file_path;
File dir ;
File file;
if (!isExternalStorageWritable(context)) {
Logger.e("!!! external storage not writable");
return null;
}
if (dir_name == null) {
dir_path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath() + File.separator + DEFAULT_DIR_NAME;
} else {
dir_path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath() + File.separator + dir_name;
}
Logger.d("... going to access an external dir:" + dir_path);
dir = new File(dir_path);
if (!dir.exists()) {
Logger.d("... going to mkdirs:" + dir_path);
if (!dir.mkdirs()) {
Logger.e("!!! failed to mkdirs");
return null;
}
}
if (file_name == null) {
file_path = dir_path + File.separator + generateFileNameBasedOnTimeStamp();
} else {
file_path = dir_path + File.separator + file_name;
}
Logger.d("... going to return an external dir:" + file_path);
file = new File(file_path);
if (file.exists()) {
Logger.d("... before creating to delete an external dir:" + file.getAbsolutePath());
if (!file.delete()) {
Logger.e("!!! failed to delete file");
return null;
}
}
return file;
}
public File createInternalFile(String dir_name, String file_name, Context context) {
String dir_path;
String file_path;
File dir ;
File file;
if (dir_name == null) {
dir = new ContextWrapper(context).getDir(DEFAULT_DIR_NAME, Context.MODE_PRIVATE);
} else {
dir = new ContextWrapper(context).getDir(dir_name, Context.MODE_PRIVATE);
}
dir_path = dir.getAbsolutePath();
Logger.d("... going to access an internal dir:" + dir_path);
if (!dir.exists()) {
Logger.d("... going to mkdirs:" + dir_path);
if (!dir.mkdirs()) {
Logger.e("!!! mkdirs failed");
return null;
}
}
if (file_name == null) {
file = new File(dir, generateFileNameBasedOnTimeStamp());
} else {
file = new File(dir, file_name);
}
file_path = file.getAbsolutePath();
Logger.d("... going to return an internal dir:" + file_path);
if (file.exists()) {
Logger.d("... before creating to delete an external dir:" + file.getAbsolutePath());
if (!file.delete()) {
Logger.e("!!! failed to delete file");
return null;
}
}
return file;
}
public File getExternalFile(String dir_name, String file_name, Context context) {
String dir_path;
String file_path;
File file;
if (!isExternalStorageWritable(context)) {
Logger.e("!!! external storage not writable");
return null;
}
if (dir_name == null) {
dir_path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath() + File.separator + DEFAULT_DIR_NAME;
} else {
dir_path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath() + File.separator + dir_name;
}
if (file_name == null) {
file_path = dir_path;
} else {
file_path = dir_path + File.separator + file_name;
}
Logger.d("... going to return an external file:" + file_path);
file = new File(file_path);
if (file.exists()) {
Logger.d("... file exists:" + file.getAbsolutePath());
} else {
Logger.e("!!! file does't exist:" + file.getAbsolutePath());
}
return file;
}
public File getInternalFile(String dir_name, String file_name, Context context) {
String file_path;
File dir ;
File file;
if (dir_name == null) {
dir = new ContextWrapper(context).getDir(DEFAULT_DIR_NAME, Context.MODE_PRIVATE);
} else {
dir = new ContextWrapper(context).getDir(dir_name, Context.MODE_PRIVATE);
}
if (file_name == null) {
file = new File(dir.getAbsolutePath());
} else {
file = new File(dir, file_name);
}
file_path = file.getAbsolutePath();
Logger.d("... going to return an internal dir:" + file_path);
if (file.exists()) {
Logger.d("... file exists:" + file.getAbsolutePath());
} else {
Logger.e("!!! file does't exist:" + file.getAbsolutePath());
}
return file;
}
private byte[] readBytesFromFile(File file) {
Logger.d(">>> path:" + file.getAbsolutePath());
FileInputStream fis;
long file_length;
byte[] buffer;
int offset = 0;
int next = 0;
if (!file.exists()) {
Logger.e("!!! file doesn't exists");
return null;
}
if (file.length() > Integer.MAX_VALUE) {
Logger.e("!!! file length is out of max of int");
return null;
} else {
file_length = file.length();
}
try {
fis = new FileInputStream(file);
//buffer = new byte[(int) file_length];
buffer = new byte[(int) file.length()];
long time_start = System.currentTimeMillis();
while (true) {
Logger.d("... now next:" + next + " and offset:" + offset);
if (System.currentTimeMillis() - time_start > 1000) {
Logger.e("!!! left due to time out");
break;
}
next = fis.read(buffer, offset, (buffer.length-offset));
if (next < 0 || offset >= buffer.length) {
Logger.d("... completed to read");
break;
}
offset += next;
}
//if (offset < buffer.length) {
if (offset < (int) file_length) {
Logger.e("!!! not complete to read");
return null;
}
fis.close();
return buffer;
} catch (IOException e) {
e.printStackTrace();
Logger.e("!!! IOException");
return null;
}
}
public byte[] readBytesFromFile(File file, boolean is_fis_fos_only) {
if (file == null) return null;
if (is_fis_fos_only) {
return readBytesFromFile(file);
}
Logger.d(">>> path:" + file.getAbsolutePath());
FileInputStream fis;
BufferedInputStream bis;
ByteArrayOutputStream bos;
byte[] buf = new byte[(int) file.length()];
int num_read;
if (!file.exists()) {
Logger.e("!!! file doesn't exists");
return null;
}
try {
fis = new FileInputStream(file);
bis = new BufferedInputStream(fis);
bos = new ByteArrayOutputStream();
long time_start = System.currentTimeMillis();
while (true) {
if (System.currentTimeMillis() - time_start > 1000) {
Logger.e("!!! left due to time out");
break;
}
num_read = bis.read(buf, 0, buf.length); //1024 bytes per call
if (num_read < 0) break;
bos.write(buf, 0, num_read);
}
buf = bos.toByteArray();
fis.close();
bis.close();
bos.close();
return buf;
} catch (FileNotFoundException e) {
e.printStackTrace();
Logger.e("!!! FileNotFoundException");
return null;
} catch (IOException e) {
e.printStackTrace();
Logger.e("!!! IOException");
return null;
}
}
/**
* streams (InputStream and OutputStream) transfer binary data
* if to write a string to a stream, must first convert it to bytes, or in other words encode it
*/
public boolean writeStringToFile(File file, String string, Charset charset) {
if (file == null) return false;
if (string == null) return false;
return writeBytesToFile(file, string.getBytes((charset == null) ? DEFAULT_CHARSET:charset));
}
public boolean writeBytesToFile(File file, byte[] data) {
if (file == null) return false;
if (data == null) return false;
FileOutputStream fos;
BufferedOutputStream bos;
try {
fos = new FileOutputStream(file);
bos = new BufferedOutputStream(fos);
bos.write(data, 0, data.length);
bos.flush();
bos.close();
fos.close();
} catch (IOException e) {
e.printStackTrace();
Logger.e("!!! IOException");
return false;
}
return true;
}
/**
* io blocks until some input/output is available.
*/
public boolean copy(File source, File destination) {
if (source == null || destination == null) return false;
Logger.d(">>> source:" + source.getAbsolutePath() + ", destination:" + destination.getAbsolutePath());
try {
FileInputStream fis = new FileInputStream(source);
FileOutputStream fos = new FileOutputStream(destination);
byte[] buffer = new byte[(int) source.length()];
int len;
while (EOF != (len = fis.read(buffer))) {
fos.write(buffer, 0, len);
}
if (true) { //debug
byte[] copies = readBytesFromFile(destination);
if (copies != null) {
int copy_len = copies.length;
Logger.d("... stream read and write done for " + copy_len + " bytes");
}
}
return destination.length() != 0;
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
public void list(final String path, final String end, final List<File> files) {
Logger.d(">>> path:" + path + ", end:" + end);
File file = new File(path);
if (file.isDirectory()) {
for (File child : file.listFiles()){
list(child.getAbsolutePath(), end, files);
}
} else if (file.isFile()) {
if (end.equals("")) {
files.add(file);
} else {
if (file.getName().endsWith(end)) files.add(file);
}
}
}
public String[] splitFileName(File file, String split) {
String path;
String ext;
int lastIndexOfSplit = file.getAbsolutePath().lastIndexOf(split);
if (lastIndexOfSplit < 0) {
path = file.getAbsolutePath();
ext = "";
} else {
path = file.getAbsolutePath().substring(0, lastIndexOfSplit);
ext = file.getAbsolutePath().substring(lastIndexOfSplit);
}
return new String[] {path, ext};
}
public File rename(File old_file, String new_name) {
if (old_file == null || new_name == null) return null;
Logger.d(">>> old file path:" + old_file.getAbsolutePath() + ", new file name:" + new_name);
File new_file = new File(old_file, new_name);
if (!old_file.equals(new_file)) {
if (new_file.exists()) { //if find out previous file/dir at new path name exists
if (new_file.delete()) {
Logger.d("... succeeded to delete previous file at new abstract path name:" + new_file.getAbsolutePath());
} else {
Logger.e("!!! failed to delete previous file at new abstract path name");
return null;
}
}
if (old_file.renameTo(new_file)) {
Logger.d("... succeeded to rename old file to new abstract path name:" + new_file.getAbsolutePath());
} else {
Logger.e("!!! failed to rename old file to new abstract path name");
}
} else {
Logger.d("... new and old file have the equal abstract path name:" + new_file.getAbsolutePath());
}
return new_file;
}
public boolean remove(final String path, final String end) {
Logger.d(">>> path:" + path + ", end:" + end);
File file = new File(path);
boolean result = false;
if (file.isDirectory()) {
for (File child : file.listFiles()){
result = remove(child.getAbsolutePath(), end);
}
} else if (file.isFile()) {
if (end.equals("")) {
result = file.delete();
} else {
if (file.getName().endsWith(end)) result = file.delete();
}
} else {
Logger.e("!!! child is not file or directory");
}
return result;
}
#TargetApi(Build.VERSION_CODES.O)
public byte[] readNIOBytesFromFile(String path) throws IOException {
Logger.d(">>> path:" + path);
if (!Files.exists(Paths.get(path), LinkOption.NOFOLLOW_LINKS)) {
Logger.e("!!! file doesn't exists");
return null;
} else {
return Files.readAllBytes(Paths.get(path));
}
}
#TargetApi(Build.VERSION_CODES.O)
public File writeNIOBytesToFile(String dir, String name, byte[] data) {
Logger.d(">>> dir:" + dir + ", name:" + name);
Path path_dir;
Path path_file;
try {
if (!Files.exists(Paths.get(dir), LinkOption.NOFOLLOW_LINKS)) {
Logger.d("... make a dir");
path_dir = Files.createDirectories(Paths.get(dir));
if (path_dir == null) {
Logger.e("!!! failed to make a dir");
return null;
}
}
path_file = Files.write(Paths.get(name), data);
return path_file.toFile();
} catch (IOException e) {
e.printStackTrace();
Logger.e("!!! IOException");
return null;
}
}
#TargetApi(Build.VERSION_CODES.O)
public void listNIO(final String dir, final String end, final List<File> files) throws IOException {
Logger.d(">>> dir:" + dir + ", end:" + end);
Files.walkFileTree(Paths.get(dir), new FileVisitor<Path>() {
#Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) {
Logger.d("... file:" + dir.getFileName());
return FileVisitResult.CONTINUE;
}
#Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
Logger.d("... file:" + file.getFileName());
if (end.equals("")) {
files.add(file.toFile());
} else {
if (file.endsWith(end)) files.add(file.toFile());
}
return FileVisitResult.CONTINUE;
}
#Override
public FileVisitResult visitFileFailed(Path file, IOException exc) {
Logger.d("... file:" + file.getFileName());
if (end.equals("")) {
files.add(file.toFile());
} else {
if (file.endsWith(end)) files.add(file.toFile());
}
return FileVisitResult.CONTINUE;
}
#Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc) {
Logger.d("... file:" + dir.getFileName());
return FileVisitResult.CONTINUE;
}
});
}
/**
* recursion
*/
private int factorial (int x) {
if (x > 1) return (x*(factorial(x-1)));
else if (x == 1) return x;
else return 0;
}
}

For getting a file properly using a context uri,
Thanks to answers from #Mohsents , #Bogdan Kornev , #CommonsWare , #Juan Camilo Rodriguez Durán ;
I created an inputStream from uri and used this iStream to create a temporary file finally I am able to extract uri and path from this file.
fun createFileFromContentUri(fileUri : Uri) : File{
var fileName : String = ""
fileUri.let { returnUri ->
requireActivity().contentResolver.query(returnUri,null,null,null)
}?.use { cursor ->
val nameIndex = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)
cursor.moveToFirst()
fileName = cursor.getString(nameIndex)
}
// For extract file mimeType
val fileType: String? = fileUri.let { returnUri ->
requireActivity().contentResolver.getType(returnUri)
}
val iStream : InputStream = requireActivity().contentResolver.openInputStream(fileUri)!!
val outputDir : File = context?.cacheDir!!
val outputFile : File = File(outputDir,fileName)
copyStreamToFile(iStream, outputFile)
iStream.close()
return outputFile
}
fun copyStreamToFile(inputStream: InputStream, outputFile: File) {
inputStream.use { input ->
val outputStream = FileOutputStream(outputFile)
outputStream.use { output ->
val buffer = ByteArray(4 * 1024) // buffer size
while (true) {
val byteCount = input.read(buffer)
if (byteCount < 0) break
output.write(buffer, 0, byteCount)
}
output.flush()
}
}
}

I made this like the following way:
try {
readImageInformation(new File(contentUri.getPath()));
} catch (IOException e) {
readImageInformation(new File(getRealPathFromURI(context,
contentUri)));
}
public static String getRealPathFromURI(Context context, Uri contentUri) {
String[] proj = { MediaStore.Images.Media.DATA };
Cursor cursor = context.getContentResolver().query(contentUri, proj,
null, null, null);
int column_index = cursor
.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
}
So basically first I try to use a file i.e. picture taken by camera and saved on SD card. This don't work for image returned by:
Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
That case there is a need to convert Uri to real path by getRealPathFromURI() function.
So the conclusion is that it depends on what type of Uri you want to convert to File.

After lots of searches and trying different approaches, I found this one working on different Android versions:
First copy this function:
fun getRealPathFromUri(context: Context, contentUri: Uri): String {
var cursor: Cursor? = null
try {
val proj: Array<String> = arrayOf(MediaStore.Images.Media.DATA)
cursor = context.contentResolver.query(contentUri, proj, null, null, null)
val columnIndex = cursor?.getColumnIndexOrThrow(MediaStore.Images.Media.DATA)
cursor?.moveToFirst()
return columnIndex?.let { cursor?.getString(it) } ?: ""
} finally {
cursor?.close()
}
}
And then, generate a file like this:
File(getRealPathFromUri(context, uri))

uri.toString() gives me: "content://com.google.android.apps.nbu.files.provider/1/file%3A%2F%2F%2Fstorage%2Femulated%2F0%2FDownload%2Fbackup.file"
uri.getPath() gives me: "/1/file:///storage/emulated/0/Download/backup.file"
new File(uri.getPath()) gives me "/1/file:/storage/emulated/0/Download/backup.file".
So if you have an access to file and want to avoid using ContentResolver or directly reading file, the answer is:
private String uriToPath( Uri uri )
{
File backupFile = new File( uri.getPath() );
String absolutePath = backupFile.getAbsolutePath();
return absolutePath.substring( absolutePath.indexOf( ':' ) + 1 );
}
Error handling is skipped to simplify the answer

Use this to write to file, It worked for me when uri of gif was provided by GBoard and I have to copy that gif in my app data.
try {
String destinationFilePath = getExternalFilesDir("gifs") + "/tempFile.txt";
InputStream inputStream = getContentResolver().openInputStream(uri);
OutputStream outputStream = new FileOutputStream(destinationFilePath);
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
inputStream.close();
outputStream.close();
}
catch (Exception e) {
e.printStackTrace();
}

Some libraries are required File Objects for a process like a retrofit, some image editors e.t.c.
to convert URI to file object or anything similar we have a way which is to support all android old versions and upcoming versions.
Step 1:
You have to create a new file inside FilesDir which is nonreadable to other Apps with the same name as our file and extension.
Step 2:
You have to copy the content of the URI to create a file by using InputStream.
File f = getFile(getApplicationContext(), uri);
public static File getFile(Context context, Uri uri) throws IOException {
File destinationFilename = new File(context.getFilesDir().getPath() + File.separatorChar + queryName(context, uri));
try (InputStream ins = context.getContentResolver().openInputStream(uri)) {
createFileFromStream(ins, destinationFilename);
} catch (Exception ex) {
Log.e("Save File", ex.getMessage());
ex.printStackTrace();
}
return destinationFilename;
}
public static void createFileFromStream(InputStream ins, File destination) {
try (OutputStream os = new FileOutputStream(destination)) {
byte[] buffer = new byte[4096];
int length;
while ((length = ins.read(buffer)) > 0) {
os.write(buffer, 0, length);
}
os.flush();
} catch (Exception ex) {
Log.e("Save File", ex.getMessage());
ex.printStackTrace();
}
}
private static String queryName(Context context, Uri uri) {
Cursor returnCursor =
context.getContentResolver().query(uri, null, null, null, null);
assert returnCursor != null;
int nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
returnCursor.moveToFirst();
String name = returnCursor.getString(nameIndex);
returnCursor.close();
return name;
}

Kotlin 2022
suspend fun Context.createFileFromAsset(assetName: String, fileName: String): File? {
return withContext(Dispatchers.IO) {
runCatching {
val stream = assets.open(assetName)
val file = File(cacheDir.absolutePath, fileName)
org.apache.commons.io.FileUtils.copyInputStreamToFile(stream, file)
file
}.onFailure { Timber.e(it) }.getOrNull()
}
}
When done with the File make sure to call .delete() on it. Kudos to #Mohsent

For folks that are here looking for a solution for images in particular here it is.
private Bitmap getBitmapFromUri(Uri contentUri) {
String path = null;
String[] projection = { MediaStore.Images.Media.DATA };
Cursor cursor = getContentResolver().query(contentUri, projection, null, null, null);
if (cursor.moveToFirst()) {
int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
path = cursor.getString(columnIndex);
}
cursor.close();
Bitmap bitmap = BitmapFactory.decodeFile(path);
return bitmap;
}

File imageToUpload = new File(new URI(androidURI.toString())); works if this is a file u have created in the external storage.
For example file:///storage/emulated/0/(some directory and file name)

By the following code, I am able to get adobe application shared pdf file as a stream and saving into android application path
Android.Net.Uri fileuri =
(Android.Net.Uri)Intent.GetParcelableExtra(Intent.ExtraStream);
fileuri i am getting as {content://com.adobe.reader.fileprovider/root_external/
data/data/com.adobe.reader/files/Downloads/sample.pdf}
string filePath = fileuri.Path;
filePath I am gettings as root_external/data/data/com.adobe.reader/files/Download/sample.pdf
using (var stream = ContentResolver.OpenInputStream(fileuri))
{
byte[] fileByteArray = ToByteArray(stream); //only once you can read bytes from stream second time onwards it has zero bytes
string fileDestinationPath ="<path of your destination> "
convertByteArrayToPDF(fileByteArray, fileDestinationPath);//here pdf copied to your destination path
}
public static byte[] ToByteArray(Stream stream)
{
var bytes = new List<byte>();
int b;
while ((b = stream.ReadByte()) != -1)
bytes.Add((byte)b);
return bytes.ToArray();
}
public static string convertByteArrayToPDF(byte[] pdfByteArray, string filePath)
{
try
{
Java.IO.File data = new Java.IO.File(filePath);
Java.IO.OutputStream outPut = new Java.IO.FileOutputStream(data);
outPut.Write(pdfByteArray);
return data.AbsolutePath;
}
catch (System.Exception ex)
{
return string.Empty;
}
}

you can use this function for get file from uri in new android and older
fun getFileFromUri(context: Context, uri: Uri?): File? {
uri ?: return null
uri.path ?: return null
var newUriString = uri.toString()
newUriString = newUriString.replace(
"content://com.android.providers.downloads.documents/",
"content://com.android.providers.media.documents/"
)
newUriString = newUriString.replace(
"/msf%3A", "/image%3A"
)
val newUri = Uri.parse(newUriString)
var realPath = String()
val databaseUri: Uri
val selection: String?
val selectionArgs: Array<String>?
if (newUri.path?.contains("/document/image:") == true) {
databaseUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI
selection = "_id=?"
selectionArgs = arrayOf(DocumentsContract.getDocumentId(newUri).split(":")[1])
} else {
databaseUri = newUri
selection = null
selectionArgs = null
}
try {
val column = "_data"
val projection = arrayOf(column)
val cursor = context.contentResolver.query(
databaseUri,
projection,
selection,
selectionArgs,
null
)
cursor?.let {
if (it.moveToFirst()) {
val columnIndex = cursor.getColumnIndexOrThrow(column)
realPath = cursor.getString(columnIndex)
}
cursor.close()
}
} catch (e: Exception) {
Log.i("GetFileUri Exception:", e.message ?: "")
}
val path = realPath.ifEmpty {
when {
newUri.path?.contains("/document/raw:") == true -> newUri.path?.replace(
"/document/raw:",
""
)
newUri.path?.contains("/document/primary:") == true -> newUri.path?.replace(
"/document/primary:",
"/storage/emulated/0/"
)
else -> return null
}
}
return if (path.isNullOrEmpty()) null else File(path)
}

public String getRealPathFromURI(Uri uri)
{
String result;
Cursor cursor = getContentResolver().query(uri, null, null, null, null);
if (cursor == null) {
result = uri.getPath();
cursor.close();
return result;
}
cursor.moveToFirst();
int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
result = cursor.getString(idx);
cursor.close();
return result;
}
Then using to get file from URI :
File finalFile = newFile(getRealPathFromURI(uri));
--HOPE CAN HELP YOU----

Get the input stream using content resolver
InputStream inputStream = getContentResolver().openInputStream(uri);
Then copy the input stream into a file
FileUtils.copyInputStreamToFile(inputStream, file);
Sample utility method:
private File toFile(Uri uri) throws IOException {
String displayName = "";
Cursor cursor = getContentResolver().query(uri, null, null, null, null);
if(cursor != null && cursor.moveToFirst()){
try {
displayName = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));
}finally {
cursor.close();
}
}
File file = File.createTempFile(
FilenameUtils.getBaseName(displayName),
"."+FilenameUtils.getExtension(displayName)
);
InputStream inputStream = getContentResolver().openInputStream(uri);
FileUtils.copyInputStreamToFile(inputStream, file);
return file;
}

Extension base on #Jacek Kwiecień answer for convert image uri to file
fun Uri.toImageFile(context: Context): File? {
val filePathColumn = arrayOf(MediaStore.Images.Media.DATA)
val cursor = context.contentResolver.query(this, filePathColumn, null, null, null)
if (cursor != null) {
if (cursor.moveToFirst()) {
val columnIndex = cursor.getColumnIndex(filePathColumn[0])
val filePath = cursor.getString(columnIndex)
cursor.close()
return File(filePath)
}
cursor.close()
}
return null
}
If we use File(uri.getPath()), it will not work
If we use extension from android-ktx, it still not work too because
https://github.com/android/android-ktx/blob/master/src/main/java/androidx/core/net/Uri.kt

Add in onActivityResult, getting docx, or pdf file
var imageUriPath = ""
imageUriPath =
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val split = (imageUri.path ? : "").split(":") //split the path.
split[1]
} else {
imageUri.path ? : ""
}
val file = File(imageUriPath)

Related

While selecting a PDF file from recent files folder in Android 11 is giving NulllPointException:Uri

The below shows the way how I tried and it gives me NulllPointException: Uri While selecting a PDF file from the recent files folder in Android 11.
Please let me know How to get pdf file path from recent folder
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.R) {
if (Environment.isExternalStorageManager()) {
//todo when permission is granted
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
String[] mimetypes = {"image/*", "application/*"};
intent.putExtra(Intent.EXTRA_MIME_TYPES, mimetypes);
intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, path);
startActivityForResult(intent, REQ_PDF);
} else {
//request for the permission
Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivity(intent);
}
} else {
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
String[] mimetypes = {"image/*", "application/*"};
intent.putExtra(Intent.EXTRA_MIME_TYPES, mimetypes);
intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, path);
startActivityForResult(intent, REQ_PDF);
}
}
});
#SuppressLint({"SetTextI18n", "NewApi"})
#Override
public void onActivityResult(int requestCode, int resultCode, #Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
InputStream inputStream = null;
try {
if (requestCode == REQ_PDF && resultCode == RESULT_OK && data != null) {
path = data.getData();
inputStream = this.getContentResolver().openInputStream(path);
byte[] pdfInBytes = new byte[inputStream.available()];
inputStream.read(pdfInBytes);
// Toast.makeText(getContext(), ""+value, Toast.LENGTH_SHORT).show();
String encodedCode = Base64.encodeToString(pdfInBytes, Base64.DEFAULT);
filePath = PathUtil.getPathFromUri(this, path);
// filePath= FileUtils.getPath(this,path);
if (filePath == null) {
// Toast.makeText(this, "null", Toast.LENGTH_SHORT).show();
SharedPrefMannager.showAlertDialog(InvoiceGenerationActivity.this, "Alert!", "Please select a file from internal storage", true);
} else {
file = new File(filePath);
file_size = Integer.parseInt(String.valueOf(file.length() / 1024));
}
tv_attachFile.setText("Change File");
tv_fileLocation.setVisibility(View.VISIBLE);
tv_fileLocation.setText(filePath);
//Toast.makeText(getContext(), encodedCode, Toast.LENGTH_SHORT).show();
}
} catch (IOException e) {
e.printStackTrace();
Toast.makeText(InvoiceGenerationActivity.this, "Something went wrong " + e, Toast.LENGTH_SHORT).show();
}
}
public class PathUtil
{
private static Uri contentUri = null;
#SuppressLint("NewApi")
public static String getPathFromUri(final Context context, final Uri uri) {
// check here to is it KITKAT or new version
final boolean isKitKatOrAbove = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
String selection = null;
String[] selectionArgs = null;
// DocumentProvider
if (isKitKatOrAbove && DocumentsContract.isDocumentUri(context, uri)) {
// ExternalStorageProvider
if (isExternalStorageDocument(uri)) {
String docId = DocumentsContract.getDocumentId(uri);
String[] split = docId.split(":");
final String type = split[0];
String fullPath = getPathFromExtSD(split);
if (fullPath != "") {
return fullPath;
} else {
return null;
}
//return getPathFromExtSD(split);
/* String fullPath =Environment.getExternalStorageState() + "/" + split[1];
if (fullPath != "") {
return fullPath;
} else {
return null;
}*/
}
// DownloadsProvider
else if (isDownloadsDocument(uri)) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
final String id;
Cursor cursor = null;
try {
cursor = context.getContentResolver().query(uri, new String[]{MediaStore.MediaColumns.DISPLAY_NAME}, null, null, null);
if (cursor != null && cursor.moveToFirst()) {
String fileName = cursor.getString(0);
String path = getExternalStorageDirectory().toString() + "/Download/" + fileName;
if (!TextUtils.isEmpty(path)) {
return path;
}
}
} finally {
if (cursor != null)
cursor.close();
}
id = DocumentsContract.getDocumentId(uri);
if (!TextUtils.isEmpty(id)) {
if (id.startsWith("raw:")) {
return id.replaceFirst("raw:", "");
}
String[] contentUriPrefixesToTry = new String[]{
"content://downloads/public_downloads",
"content://downloads/my_downloads",
"content://downloads/all_downloads"
};
for (String contentUriPrefix : contentUriPrefixesToTry) {
try {
final Uri contentUri = ContentUris.withAppendedId(Uri.parse(contentUriPrefix), Long.valueOf(id));
return getDataColumn(context, contentUri, null, null);
} catch (NumberFormatException e) {
//In Android 8 and Android P the id is not a number
return uri.getPath().replaceFirst("^/document/raw:", "").replaceFirst("^raw:", "");
}
}
}
} else {
final String id = DocumentsContract.getDocumentId(uri);
if (id.startsWith("raw:")) {
return id.replaceFirst("raw:", "");
}
try {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
contentUri = ContentUris.withAppendedId(
Uri.parse("content://downloads/public_downloads"), Long.parseLong(id)); //public
}
if (contentUri != null) {
return getDataColumn(context, contentUri, null, null);
}
} catch (NumberFormatException e) {
e.printStackTrace();
Toast.makeText(context, "" + e, Toast.LENGTH_SHORT).show();
}
}
}
// MediaProvider
else if (isMediaDocument(uri)) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];
Uri contentUri = null;
if ("image".equals(type)) {
contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
} else if ("application".equals(type)) {
contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; //MediaStore.Video.Media.EXTERNAL_CONTENT_URI
} else if ("audio".equals(type)) {
contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
}
selection = "_id=?";
selectionArgs = new String[]{split[1]};
return getDataColumn(context, contentUri, selection,
selectionArgs);
} else if (isGoogleDriveUri(uri)) {
return getDriveFilePath(uri, context);
}
} else if ("content".equalsIgnoreCase(uri.getScheme())) {
if (isGooglePhotosUri(uri)) {
return uri.getLastPathSegment();
}
if (isGoogleDriveUri(uri)) {
return getDriveFilePath(uri, context);
}
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.N) {
return getMediaFilePathForN(uri, context);
} else {
return getDataColumn(context, uri, null, null);
}
}
// File
else if ("file".equalsIgnoreCase(uri.getScheme())) {
return uri.getPath();
}
return null;
}
private static boolean fileExists(String filePath) {
File file = new File(filePath);
return file.exists();
}
private static String getPathFromExtSD(String[] pathData) {
String type = pathData[0];
String relativePath = "/" + pathData[1];
String fullPath = "";
if ("primary".equalsIgnoreCase(type)) {
fullPath = getExternalStorageDirectory() + relativePath;
if (fileExists(fullPath)) {
return fullPath;
}
}
fullPath = System.getenv("SECONDARY_STORAGE") + relativePath;
if ((null == fullPath) || (fullPath.length() == 0)) {
fullPath = System.getenv("SECONDARY_SDCARD_STORAGE");
return fullPath;
}
/* if (fileExists(fullPath)) {
return fullPath;
}*/
fullPath = System.getenv("EXTERNAL_STORAGE") + relativePath;
if ((null == fullPath) || (fullPath.length() == 0)) {
fullPath = System.getenv("EXTERNAL_SDCARD_STORAGE");
return fullPath;
}
/* if (fileExists(fullPath)) {
return fullPath;
}*/
return fullPath;
}
private static String getDriveFilePath(Uri uri, Context context) {
Uri returnUri = uri;
Cursor returnCursor = context.getContentResolver().query(returnUri, null, null, null, null);
InputStream inputStream = null;
FileOutputStream outputStream = null;
int nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
int sizeIndex = returnCursor.getColumnIndex(OpenableColumns.SIZE);
returnCursor.moveToFirst();
String name = (returnCursor.getString(nameIndex));
String size = (Long.toString(returnCursor.getLong(sizeIndex)));
File file = new File(context.getCacheDir(), name);
try {
inputStream = context.getContentResolver().openInputStream(uri);
outputStream = new FileOutputStream(file);
int read = 0;
int maxBufferSize = 1 * 1024 * 1024;
int bytesAvailable = inputStream.available();
//int bufferSize = 1024;
int bufferSize = Math.min(bytesAvailable, maxBufferSize);
final byte[] buffers = new byte[bufferSize];
while ((read = inputStream.read(buffers)) != -1) {
outputStream.write(buffers, 0, read);
}
Log.e("File Size", "Size " + file.length());
inputStream.close();
outputStream.close();
Log.e("File Path", "Path " + file.getPath());
Log.e("File Size", "Size " + file.length());
} catch (Exception e) {
Log.e("Exception", e.getMessage());
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (Exception e) {
}
}
if (outputStream != null) {
try {
outputStream.close();
} catch (Exception e) {
}
}
}
return file.getPath();
}
private static String getMediaFilePathForN(Uri uri, Context context) {
Uri returnUri = uri;
Cursor returnCursor = context.getContentResolver().query(returnUri, null, null, null, null);
int nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
int sizeIndex = returnCursor.getColumnIndex(OpenableColumns.SIZE);
returnCursor.moveToFirst();
String name = (returnCursor.getString(nameIndex));
String size = (Long.toString(returnCursor.getLong(sizeIndex)));
File file = new File(context.getFilesDir(), name);
try {
InputStream inputStream = context.getContentResolver().openInputStream(uri);
FileOutputStream outputStream = new FileOutputStream(file);
int read = 0;
int maxBufferSize = 1 * 1024 * 1024;
int bytesAvailable = inputStream.available();
//int bufferSize = 1024;
int bufferSize = Math.min(bytesAvailable, maxBufferSize);
final byte[] buffers = new byte[bufferSize];
while ((read = inputStream.read(buffers)) != -1) {
outputStream.write(buffers, 0, read);
}
Log.e("File Size", "Size " + file.length());
inputStream.close();
outputStream.close();
Log.e("File Path", "Path " + file.getPath());
Log.e("File Size", "Size " + file.length());
} catch (Exception e) {
Log.e("Exception", e.getMessage());
}
return file.getPath();
}
private static String getDataColumn(Context context, Uri uri,
String selection, String[] selectionArgs) {
Cursor cursor = null;
final String column = "_data";
final String[] projection = {column};
try {
cursor = context.getContentResolver().query(uri, projection, selection,
selectionArgs, null);
if (cursor != null && cursor.moveToFirst()) {
final int index = cursor.getColumnIndexOrThrow(column);
return cursor.getString(index);
}
} catch (Exception e) {
// Toast.makeText(context, "Something went wrong", Toast.LENGTH_SHORT).show();
} finally {
if (cursor != null)
cursor.close();
}
return null;
}
private static boolean isExternalStorageDocument(Uri uri) {
return "com.android.externalstorage.documents".equals(uri.getAuthority());
}
private static boolean isDownloadsDocument(Uri uri) {
return "com.android.providers.downloads.documents".equals(uri.getAuthority());
}
private static boolean isMediaDocument(Uri uri) {
return "com.android.providers.media.documents".equals(uri.getAuthority());
}
private static boolean isGooglePhotosUri(Uri uri) {
return "com.google.android.apps.photos.content".equals(uri.getAuthority());
}
private static boolean isGoogleDriveUri(Uri uri) {
return "com.google.android.apps.docs.storage".equals(uri.getAuthority()) || "com.google.android.apps.docs.storage.legacy".equals(uri.getAuthority());
}
}
Any help would be appreciated. I am testing on an android R device. Why is it that when selecting the file from a RECENT section in the file browser I am not getting any file path meanwhile selecting the same file in the STORAGE section is returning file path?
I have added only that else part and it's working fine. thank you for helping. referece
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;
}else {
contentUri = MediaStore.Files.getContentUri("external");
}

how to convert URI to File Android 10

how to get file object from URI OR convert URI to file object in android 10 and above versions.
final File file = new File(Environment.getExternalStorageDirectory(), "read.me");
Uri uri = Uri.fromFile(file);
You cannot convert the direct file to URI in android 10 instead of this you can make a copy of the file into your file directory which will help you to get a file object.
File f = getFile(getApplicationContext(), uri);
The below method provide you file object of URI and also you have a copy of the file in your file directory.
public static File getFile(Context context, Uri uri) throws IOException {
File destinationFilename = new File(context.getFilesDir().getPath() + File.separatorChar + queryName(context, uri));
try (InputStream ins = context.getContentResolver().openInputStream(uri)) {
createFileFromStream(ins, destinationFilename);
} catch (Exception ex) {
Log.e("Save File", ex.getMessage());
ex.printStackTrace();
}
return destinationFilename;
}
public static void createFileFromStream(InputStream ins, File destination) {
try (OutputStream os = new FileOutputStream(destination)) {
byte[] buffer = new byte[4096];
int length;
while ((length = ins.read(buffer)) > 0) {
os.write(buffer, 0, length);
}
os.flush();
} catch (Exception ex) {
Log.e("Save File", ex.getMessage());
ex.printStackTrace();
}
}
private static String queryName(Context context, Uri uri) {
Cursor returnCursor =
context.getContentResolver().query(uri, null, null, null, null);
assert returnCursor != null;
int nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
returnCursor.moveToFirst();
String name = returnCursor.getString(nameIndex);
returnCursor.close();
return name;
}
for more detail refer here

Get Path from another app (WhatsApp)

I'm not getting Path from image or video from uri that I receive from whatsApp.
Uri comes like this: content://com.whatsapp.provider.media/item/16695
Media coming from Gallery, Downloads ands others are fine.
Anyone know how to get Path? This is the code I'm using:
public String getMediaPath(Context context, Uri uri) {
if (DEBUG)
Log.d(TAG + " File -",
"Authority: " + uri.getAuthority() +
", Fragment: " + uri.getFragment() +
", Port: " + uri.getPort() +
", Query: " + uri.getQuery() +
", Scheme: " + uri.getScheme() +
", Host: " + uri.getHost() +
", Segments: " + uri.getPathSegments().toString()
);
// DocumentProvider
if (DocumentsContract.isDocumentUri(context, uri)) {
// ExternalStorageProvider
if (isExternalStorageDocument(uri)) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];
if ("primary".equalsIgnoreCase(type)) {
return Environment.getExternalStorageDirectory() + "/" + split[1];
}
}
// DownloadsProvider
else if (isDownloadsDocument(uri)) {
final String id = DocumentsContract.getDocumentId(uri);
final Uri contentUri = ContentUris.withAppendedId(
Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
return getDataColumn(context, contentUri, null, null);
}
// MediaProvider
else if (isMediaDocument(uri)) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final 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;
}
final String selection = "_id=?";
final String[] selectionArgs = new String[] {
split[1]
};
return getDataColumn(context, contentUri, selection, selectionArgs);
}
}
// MediaStore (and general)
else if ("content".equalsIgnoreCase(uri.getScheme())) {
// Return the remote address
if (isGooglePhotosUri(uri)) {
return uri.getLastPathSegment();
}
return getDataColumn(context, uri, null, null);
}
// File
else if ("file".equalsIgnoreCase(uri.getScheme())) {
return uri.getPath();
}
return null;
}
public String getDataColumn(Context context, Uri uri, String selection,
String[] selectionArgs) {
Cursor cursor = null;
final String[] column = { MediaStore.Images.Media.DATA };
final String[] projection = {
column[0]
};
try {
cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,
null);
if (cursor != null && cursor.moveToFirst()) {
if (DEBUG)
DatabaseUtils.dumpCursor(cursor);
final int index = cursor.getColumnIndexOrThrow(column[0]);
return cursor.getString(index);
}
} finally {
if (cursor != null)
cursor.close();
}
return null;
}
public static boolean isExternalStorageDocument(Uri uri) {
return "com.android.externalstorage.documents".equals(uri.getAuthority());
}
public static boolean isDownloadsDocument(Uri uri) {
return "com.android.providers.downloads.documents".equals(uri.getAuthority());
}
public static boolean isMediaDocument(Uri uri) {
return "com.android.providers.media.documents".equals(uri.getAuthority());
}
public static boolean isGooglePhotosUri(Uri uri) {
return "com.google.android.apps.photos.contentprovider".equals(uri.getAuthority());
}
The result of this log:
if (DEBUG)
Log.d(TAG + " File -",
"Authority: " + uri.getAuthority() +
", Fragment: " + uri.getFragment() +
", Port: " + uri.getPort() +
", Query: " + uri.getQuery() +
", Scheme: " + uri.getScheme() +
", Host: " + uri.getHost() +
", Segments: " + uri.getPathSegments().toString()
);
is this:
Authority: com.whatsapp.provider.media, Fragment: null, Port: -1, Query: null, Scheme: content, Host: com.whatsapp.provider.media, Segments: [item, 16348]
And the cursor on getDataColumn looks like this:
>>>>> Dumping cursor
android.content.ContentResolver$CursorWrapperInner#1fc81ac
I/System.out: 0 {
I/System.out: }
I/System.out: <<<<<
You can try this it will help for you.You can't get path from WhatsApp directly.If you need an file path first copy file and send new file path.
Using the code below
public static String getFilePathFromURI(Context context, Uri contentUri) {
String fileName = getFileName(contentUri);
if (!TextUtils.isEmpty(fileName)) {
File copyFile = new File(TEMP_DIR_PATH + fileName+".jpg");
copy(context, contentUri, copyFile);
return copyFile.getAbsolutePath();
}
return null;
}
public static String getFileName(Uri uri) {
if (uri == null) return null;
String fileName = null;
String path = uri.getPath();
int cut = path.lastIndexOf('/');
if (cut != -1) {
fileName = path.substring(cut + 1);
}
return fileName;
}
public static void copy(Context context, Uri srcUri, File dstFile) {
try {
InputStream inputStream = context.getContentResolver().openInputStream(srcUri);
if (inputStream == null) return;
OutputStream outputStream = new FileOutputStream(dstFile);
IOUtils.copy(inputStream, outputStream);
inputStream.close();
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
Then IOUtils class is like below
public class IOUtils {
private static final int BUFFER_SIZE = 1024 * 2;
private IOUtils() {
// Utility class.
}
public static int copy(InputStream input, OutputStream output) throws Exception, IOException {
byte[] buffer = new byte[BUFFER_SIZE];
BufferedInputStream in = new BufferedInputStream(input, BUFFER_SIZE);
BufferedOutputStream out = new BufferedOutputStream(output, BUFFER_SIZE);
int count = 0, n = 0;
try {
while ((n = in.read(buffer, 0, BUFFER_SIZE)) != -1) {
out.write(buffer, 0, n);
count += n;
}
out.flush();
} finally {
try {
out.close();
} catch (IOException e) {
Log.e(e.getMessage(), e.toString());
}
try {
in.close();
} catch (IOException e) {
Log.e(e.getMessage(), e.toString());
}
}
return count;
}
}
you can try to this , then you get a bitmap of selected image and then you can easily find it's native path from Device Default Gallery.
Bitmap roughBitmap= null;
try {
// Works with content://, file://, or android.resource:// URIs
InputStream inputStream =
getContentResolver().openInputStream(uri);
roughBitmap= BitmapFactory.decodeStream(inputStream);
// calc exact destination size
Matrix m = new Matrix();
RectF inRect = new RectF(0, 0, roughBitmap.Width, roughBitmap.Height);
RectF outRect = new RectF(0, 0, dstWidth, dstHeight);
m.SetRectToRect(inRect, outRect, Matrix.ScaleToFit.Center);
float[] values = new float[9];
m.GetValues(values);
// resize bitmap if needed
Bitmap resizedBitmap = Bitmap.CreateScaledBitmap(roughBitmap, (int) (roughBitmap.Width * values[0]), (int) (roughBitmap.Height * values[4]), true);
string name = "IMG_" + new Java.Text.SimpleDateFormat("yyyyMMdd_HHmmss").Format(new Java.Util.Date()) + ".png";
var sdCardPath= Environment.GetExternalStoragePublicDirectory("DCIM").AbsolutePath;
Java.IO.File file = new Java.IO.File(sdCardPath);
if (!file.Exists())
{
file.Mkdir();
}
var filePath = System.IO.Path.Combine(sdCardPath, name);
} catch (FileNotFoundException e) {
// Inform the user that things have gone horribly wrong
}
You can't get a path to file from WhatsApp. They don't expose it now. The only thing you can get is InputStream:
InputStream is = getContentResolver().openInputStream(Uri.parse("content://com.whatsapp.provider.media/item/16695"));
Using is you can show a picture from WhatsApp in your app.
You can also convert the URI to file and then to bytes if you want to upload the photo to your server.
Check out : https://www.stackoverflow.com/a/49575321
Using the code example below will return to you the bitmap :
BitmapFactory.decodeStream(getContentResolver().openInputStream(Uri.parse("content://com.whatsapp.provider.media/item/128752")))
After that you all know what you have to do.
It works for me for opening small text file... I didn't try in other file
protected void viewhelper(Intent intent) {
Uri a = intent.getData();
if (!a.toString().startsWith("content:")) {
return;
}
//Ok Let's do it
String content = readUri(a);
//do something with this content
}
here is the readUri(Uri uri) method
private String readUri(Uri uri) {
InputStream inputStream = null;
try {
inputStream = getContentResolver().openInputStream(uri);
if (inputStream != null) {
byte[] buffer = new byte[1024];
int result;
String content = "";
while ((result = inputStream.read(buffer)) != -1) {
content = content.concat(new String(buffer, 0, result));
}
return content;
}
} catch (IOException e) {
Log.e("receiver", "IOException when reading uri", e);
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
Log.e("receiver", "IOException when closing stream", e);
}
}
}
return null;
}
I got it from this repository https://github.com/zhutq/android-file-provider-demo/blob/master/FileReceiver/app/src/main/java/com/demo/filereceiver/MainActivity.java
I modified some code so that it work.
Manifest file:
<activity android:name=".MainActivity">
<intent-filter >
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="*/*" />
</intent-filter>
</activity>
You need to add
#Override
protected void onCreate(Bundle savedInstanceState) {
/*
* Your OnCreate
*/
Intent intent = getIntent();
String action = intent.getAction();
String type = intent.getType();
//VIEW"
if (Intent.ACTION_VIEW.equals(action) && type != null) {
viewhelper(intent); // Handle text being sent
}
}
protected void onCreate(Bundle savedInstanceState) {
/*
* Your OnCreate
*/
Intent intent = getIntent();
String action = intent.getAction();
String type = intent.getType();
//VIEW"
if (Intent.ACTION_VIEW.equals(action) && type != null) {viewhekper(intent);//Handle text being sent}

Picking an Image File From an External SD Card (USB OTG Storage)

i saw this question:
How app can access files on USB OTG storages in Android 6.0 (API level 23) without root?
but it did not answer my question. i have an external SD card that i would like to access from my app and copy images from it to an internal storage. is this possible?
i am using android nouget
this is what i have done so far...
public static List<StorageInfo> getStorageList() {
List<StorageInfo> list = new ArrayList<StorageInfo>();
String def_path = Environment.getExternalStorageDirectory().getPath();
boolean def_path_removable = Environment.isExternalStorageRemovable();
String def_path_state = Environment.getExternalStorageState();
boolean def_path_available = def_path_state.equals(Environment.MEDIA_MOUNTED)
|| def_path_state.equals(Environment.MEDIA_MOUNTED_READ_ONLY);
boolean def_path_readonly = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED_READ_ONLY);
HashSet<String> paths = new HashSet<String>();
int cur_removable_number = 1;
if (def_path_available) {
paths.add(def_path);
list.add(0, new StorageInfo(def_path, def_path_readonly, def_path_removable, def_path_removable ? cur_removable_number++ : -1));
}
BufferedReader buf_reader = null;
try {
buf_reader = new BufferedReader(new FileReader("/proc/mounts"));
String line;
Log.d(TAG, "/proc/mounts");
while ((line = buf_reader.readLine()) != null) {
Log.d(TAG, line);
if (line.contains("vfat") || line.contains("/mnt")) {
StringTokenizer tokens = new StringTokenizer(line, " ");
String unused = tokens.nextToken(); //device
String mount_point = tokens.nextToken(); //mount point
if (paths.contains(mount_point)) {
continue;
}
unused = tokens.nextToken(); //file system
List<String> flags = Arrays.asList(tokens.nextToken().split(",")); //flags
boolean readonly = flags.contains("ro");
if (line.contains("/dev/block/vold")) {
if (!line.contains("/mnt/secure")
&& !line.contains("/mnt/asec")
&& !line.contains("/mnt/obb")
&& !line.contains("/dev/mapper")
&& !line.contains("tmpfs")) {
paths.add(mount_point);
list.add(new StorageInfo(mount_point, readonly, true, cur_removable_number++));
}
}
}
}
} catch (FileNotFoundException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
} finally {
if (buf_reader != null) {
try {
buf_reader.close();
} catch (IOException ex) {}
}
}
return list;
}
void open()
{
String sdCardPath = getStorageList().get(1).path+"/DCIM/100_FLIR/"; //placed it statically for now...
File imagesFolder = new File(Environment.getExternalStorageDirectory(), context.getString(R.string.FolderName));
if (!imagesFolder.exists())
{
imagesFolder.mkdirs();
}
String timeStamp = new SimpleDateFormat("yyMMdd_HHmmss", Locale.ENGLISH).format(new Date());
File image = new File(imagesFolder, "IM_" + timeStamp + ".jpeg");
imagepath = image.getAbsolutePath();
Uri uriImagePath = GlobalFunctions.getFileURI(context,image);
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
Uri uri = Uri.parse(path);
intent.setDataAndType(uri, "*/*");
intent.putExtra(MediaStore.EXTRA_OUTPUT,uriImagePath);
intent.putExtra("return-data", true);
startActivityForResult(intent,458);
}
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 458 && resultCode == Activity.RESULT_OK)
{
File f = new File(imagepath);
try {
f.createNewFile();
copyFile(new File(getRealPathFromURI_API19(this,data.getData())), f); //getRealPathFromURI_API19 is returning empty for files on sd card
} catch (IOException e) {
globalVariables.AppLogging(GlobalVariables.ERROR_GENERAL_MSG_LOG,e.toString(), LogFileName.ErrorLogFilename);
}
}
public static String getRealPathFromURI_API19(Context context, Uri uri) {
String filePath = "";
// Image pick from recent
String wholeID = DocumentsContract.getDocumentId(uri);
// Split at colon, use second item in the array
String id = wholeID.split(":")[1];
String[] column = {MediaStore.Images.Media.DATA};
// where id is equal to
String sel = MediaStore.Images.Media._ID + "=?";
Cursor cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
column, sel, new String[]{id}, null);
int columnIndex = cursor.getColumnIndex(column[0]);
if (cursor.moveToFirst()) {
filePath = cursor.getString(columnIndex);
}
cursor.close();
return filePath;
}
void copyFile(File sourceFile, File destFile) throws IOException {
if (!sourceFile.exists()) {
return;
}
FileChannel source = null;
FileChannel destination = null;
source = new FileInputStream(sourceFile).getChannel();
destination = new FileOutputStream(destFile).getChannel();
if (destination != null && source != null) {
destination.transferFrom(source, 0, source.size());
}
if (source != null) {
source.close();
}
if (destination != null) {
destination.close();
}
}

Android Getting file name and path from onActivityResult

What I am trying to achieve. I have a button, when the button is clicked the app opens a file picker and the user selects a file. The app then uses a FileInputStream to read the file and generates a byte[]. I have a TextView below the button which will then simply display the byte[].length. Here is the code in the button.onClick() event:
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
requestFilePickerCode = parent.registerActivityResultListener(this);
try
{
parent.startActivityForResult(intent, requestFilePickerCode);
}
catch (ActivityNotFoundException e)
{
Toast.makeText(task.getParent(), "Please install a file manager", Toast.LENGTH_SHORT).show();
}
Now this code works and I have confirmed that it fires onActivityResult when the file is chosen. I simply print a Log to display data.toString() which produces the following output:
11-02 15:14:36.196 2535-2535/? V/class za.co.gpsts.gpsjobcard.utility.handlers.PebbleTypeHandlerBinary: -----> content:/com.android.providers.downloads.documents/document/1
So it seems to be getting the selected file. When I run the app and I select a file it throws my custom error:
11-02 15:14:36.196 2535-2535/? E/class za.co.gpsts.gpsjobcard.utility.handlers.PebbleTypeHandlerBinary: -----> File does not exist
This obviously indicates that I am not getting the file. Here is my code:
#Override
public boolean onActivityResult(int requestCode, int resultCode, Intent data)
{
byte[] fileContent;
// check that data is not null and assign to file if not null
if (data != null)
{
Uri uri = data.getData();
String uriString = uri.toString();
file = new File(uriString);
Log.v(PebbleTypeHandlerBinary.class.toString(), "-----> " + file.toString());
// declare file input stream and read bytes
// write to string variable to test and test output
FileInputStream fin = null;
try
{
fin = new FileInputStream(file);
fileContent = new byte[(int) file.length()];
fin.read(fileContent);
String test = new String(fileContent);
Log.v(PebbleTypeHandlerBinary.class.toString(), "=====> " + test);
}
catch (FileNotFoundException e)
{
Toast.makeText(task.getParent(), "File not found", Toast.LENGTH_SHORT).show();
Log.e(PebbleTypeHandlerBinary.class.toString(), "-----> File does not exist");
}
catch (IOException e)
{
Toast.makeText(task.getParent(), "Error reading file", Toast.LENGTH_SHORT).show();
Log.e(PebbleTypeHandlerBinary.class.toString(), "-----> Error while reading the file");
}
finally
{
// close the file input stream to stop mem leaks
try
{
if (fin != null)
{
fin.close();
}
} catch (IOException e)
{
Log.e(PebbleTypeHandlerBinary.class.toString(), "-----> Error closing the stream");
}
}
Log.v(PebbleTypeHandlerBinary.class.toString(), data.toString());
}
return false;
}
Please can you guys review my code and help me to get this working. Any help would be appreciated.
/* you can get just name and size with this method.
use Cursor .
Uri uri = data.getData();
get data from onActivityResult()
*/;
Cursor cursor = getContentResolver().query(uri, null, null, null, null);
int nameIndex = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
int sizeIndex = cursor.getColumnIndex(OpenableColumns.SIZE);
cursor.moveToFirst();
String name = cursor.getString(nameIndex);
String size = Long.toString(cursor.getLong(sizeIndex));
Toast.makeText(this, "name : "+name+"\nsize : "+size, Toast.LENGTH_SHORT).show();
I managed to fix it as follows:
I used inputStream = task.getParent().getContentResolver().openInputStream(uri); to get an InputStream. Then used a ByteArrayOutputStream to write to a byte[]. See code below.
#Override
public boolean onActivityResult(int requestCode, int resultCode, Intent data)
{
Uri uri = data.getData();
byte[] fileContent;
InputStream inputStream = null;
try
{
inputStream = task.getParent().getContentResolver().openInputStream(uri);
if (inputStream != null)
{
fileContent = new byte[(int)file.length()];
inputStream.read(fileContent);
fileContent = new byte[1024];
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int read;
while((read=inputStream.read(fileContent))>-1) baos.write(fileContent,0,read);
fileContent = baos.toByteArray();
baos.close();
Log.v(PebbleTypeHandlerBinary.class.toString(), "-----> Input Stream: " + inputStream);
Log.v(PebbleTypeHandlerBinary.class.toString(), "-----> Byte Array: " + fileContent.length);
}
else
{
Log.e(PebbleTypeHandlerBinary.class.toString(), "-----> Input Stream is null");
}
}
catch (FileNotFoundException e)
{
Log.e(PebbleTypeHandlerBinary.class.toString(), "-----> File not found", e);
}
catch (IOException e)
{
Log.e(PebbleTypeHandlerBinary.class.toString(), "-----> Error reading file", e);
}
finally
{
if (inputStream != null)
{
try
{
inputStream.close();
}
catch (IOException e)
{
Log.e(PebbleTypeHandlerBinary.class.toString(), "-----> Error reading file", e);
}
}
}
return false;
}
Thanks for all your help.
U can search converting uri to filepath.
GetData() retruns a uri.
But new File() need a filepath param;
Like this:
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 ) ) {
Cursor cursor = context.getContentResolver().query( uri, new String[] { ImageColumns.DATA }, null, null, null );
if ( null != cursor ) {
if ( cursor.moveToFirst() ) {
int index = cursor.getColumnIndex( ImageColumns.DATA );
if ( index > -1 ) {
data = cursor.getString( index );
}
}
cursor.close();
}
}
return data;
}
1. File Name:
You can get the file name with the following method:
public static String getFileName(Context context, Uri uri) {
String result = null;
if (uri.getScheme().equals("content")) {
Cursor cursor = context.getContentResolver().query(uri, null, null, null, null);
try {
if (cursor != null && cursor.moveToFirst()) {
result = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));
}
} finally {
cursor.close();
}
}
if (result == null) {
result = uri.getPath();
int cut = result.lastIndexOf('/');
if (cut != -1) {
result = result.substring(cut + 1);
}
}
return result;
}
You will call it inside onActivityResult() and pass to it the context and uri. and you can find the uri through the intent you get from the onActivityResult which is mostly called "data", you will get the Uri from it like this:
data.data
which ".data" is the Uri.
Ex:
Utils.getFileName(this, data!!.data)
And finally it will return the file name as a String.
2. File Path:
Simply to get the file path you can get it from the data intent uri like this:
data!!.data!!.path.toString()
It will get you the path of the file as a String.

Categories

Resources