How to choose pdf file from android storage - java

I'm trying to get a pdf file from my android storage, but everytime it returns null.
It already works with image files, but when i try to get a pdf file it always returns null.
I'm already able to select the pdf file. On onActivityResult i'm able to get the uri from data, but the path is wrong ("content://com.android.providers.media.documents/document/document%3A140"), so i'm trying to get the full path using getPath method, but like i said before, it always returns null.
This code must work with android version >= Android 6.0 (Sdk 23).
private void selecionarArquivo() {
boolean marshmallow = Build.VERSION.SDK_INT >= 22;
boolean validate;
if (marshmallow) {
String permissions[] = new String[]{ Manifest.permission.READ_EXTERNAL_STORAGE };
validate = PermissionUtils.validate(getActivity(), 0, permissions);
} else {
validate = true;
}
if (validate) {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
// tipo can be application/pdf or image/*
intent.setType(tipo);
startActivityForResult(intent, Constantes.REQUEST_CODE_SELECIONAR_ARQUIVO);
} else {
AlertUtils.alert(getActivity(), R.string.necessario_aceitar_permissoes, new Runnable() {
#Override
public void run() {
getActivity().finish();
}
});
}
}
#Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
try {
LogUtil.log(TAG, "onActivityResult(): requestCode[" + requestCode + "], resultCode[" + resultCode + "]");
if (requestCode == Constantes.REQUEST_CODE_SELECIONAR_ARQUIVO && resultCode == Activity.RESULT_OK && data != null) {
LogUtil.log(TAG, "onActivityResult(): SELECIONOU");
Uri selectedImageUri = data.getData();
final String path = FileUtils.getPath(getContext(), selectedImageUri);
// here path is always null if pdf file is selected
File f = null;
if (path != null) {
f = new File(path);
}
if (f != null) {
String fileExtension = FileUtils.getFileExtension(f.getName());
if (tipo.contains("pdf") && !fileExtension.equals("pdf")) {
alert(R.string.tipo_de_arquivo_invalido);
selecionarArquivo();
} else {
Bundle bundle = new Bundle();
foto.file = f;
bundle.putSerializable(Foto.KEY, foto);
showForResult(ExemploEFotoActivity.class, bundle, Constantes.REQUEST_CODE_CONFIRMAR_FOTO);
}
}
}
} catch (Exception ex) {
ex.printStackTrace();
alert(R.string.msg_error_foto);
getActivity().finish();
}
}
FileUtils.java
public class FileUtils {
public static String getPath(final Context context, final Uri uri) {
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;
} else if ("document".equals(type)) {
contentUri = 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 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.content".equals(uri.getAuthority());
}
public 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 column_index = cursor.getColumnIndexOrThrow(column);
return cursor.getString(column_index);
}
} finally {
if (cursor != null)
cursor.close();
}
return null;
}
}

I end up using this FileUtils, wich worked perfectly.
Thanks for the answers.

Related

Unable to pick file (pdf, doc, docx) from download folder in Android 11 and above

I'm using the File Picker library.
Permission code:
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R || Environment.isExternalStorageManager()) {
//Toast.makeText(this, "We can access all files on external storage now", Toast.LENGTH_SHORT).show()
} else {
Intent intent = new Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION);
startActivityForResult(intent, FILE_REQUEST_CODE);
}
Choose file:
Intent intent = new Intent(this, FilePickerActivity.class);
intent.putExtra(FilePickerActivity.CONFIGS, new Configurations.Builder()
.setCheckPermission(true)
.setSelectedMediaFiles(mediaFiles)
.setShowFiles(true)
.setShowImages(false)
.setShowAudios(false)
.setShowVideos(false)
.setIgnoreNoMedia(false)
.enableVideoCapture(false)
.enableImageCapture(false)
.setIgnoreHiddenFile(false)
.setMaxSelection(5)
.setSuffixes("pdf", "doc", "docx")
//.setTitle("Select a file")
.build());
startActivityForResult(intent, FILE_REQUEST_CODE);
onActivityResult:
if (requestCode == FILE_REQUEST_CODE && resultCode == RESULT_OK && data != null) {
//ArrayList<MediaFile> files = data.getParcelableArrayListExtra(FilePickerActivity.MEDIA_FILES);
//Do something with files
List<MediaFile> mediaFiles = data.<MediaFile>getParcelableArrayListExtra(FilePickerActivity.MEDIA_FILES);
if (mediaFiles != null) {
System.out.println(mediaFiles.get(0).getUri());
setMediaFiles(mediaFiles);
} else {
Toast.makeText(ApplyLeaveActivity.this, "File not selected", Toast.LENGTH_SHORT).show();
}
}
Get file from selected location:
private void setMediaFiles(List<MediaFile> mediaFiles) {
this.mediaFiles.clear();
this.mediaFiles.addAll(mediaFiles);
for (int i = 0; i < mediaFiles.size(); i++) {
System.out.println(mediaFiles.get(i).getUri().getPath());
/*Uri fileUri = Uri.fromFile(selectedFile);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
fileUri = FileProvider.getUriForFile(getApplicationContext(), BuildConfig.APPLICATION_ID + ".provider", selectedFile);
}*/
String path = RealPathUtil.getRealPath(this, mediaFiles.get(i).getUri());
//String path = getPath(mediaFiles.get(i).getUri());
if (path != null && !path.isEmpty()) {
File file = new File(path);
//String path = getPathFromURI(mediaFiles.get(i).getUri());
//String path = RealPathUtil.getRealPath(this, mediaFiles.get(i).getUri());
//System.out.println("Path: " + path);
///document/raw:/storage/emulated/0/Download/file-sample_150kB(1).pdf
LeaveDocBean leaveDocBean = new LeaveDocBean();
leaveDocBean.setId("");
leaveDocBean.setFile(file.getAbsolutePath());
//leaveDocBean.setFile(path);
leaveDocBean.setFileName(path.substring(path.lastIndexOf('/') + 1));
mLeaveDocBeanList.add(leaveDocBean);
} else {
Toast.makeText(this, "Unable to select file", Toast.LENGTH_LONG).show();
}
}
refreshDocAdapter();
//fileListAdapter.notifyDataSetChanged();
}
Get its real path:
public class RealPathUtil {
public static String getRealPath(Context context, Uri fileUri) {
String realPath;
// SDK < API11
if (Build.VERSION.SDK_INT < 11) {
realPath = RealPathUtil.getRealPathFromURI_BelowAPI11(context, fileUri);
}
// SDK >= 11 && SDK < 19
else if (Build.VERSION.SDK_INT < 19) {
realPath = RealPathUtil.getRealPathFromURI_API11to18(context, fileUri);
}
// SDK > 19 (Android 4.4) and up
else {
realPath = RealPathUtil.getRealPathFromURI_API19(context, fileUri);
}
return realPath;
}
#SuppressLint("NewApi")
public static String getRealPathFromURI_API11to18(Context context, Uri contentUri) {
String[] proj = {MediaStore.Images.Media.DATA};
String result = null;
CursorLoader cursorLoader = new CursorLoader(context, contentUri, proj, null, null, null);
Cursor cursor = cursorLoader.loadInBackground();
if (cursor != null) {
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
result = cursor.getString(column_index);
cursor.close();
}
return result;
}
public static String getRealPathFromURI_BelowAPI11(Context context, Uri contentUri) {
String[] proj = {MediaStore.Images.Media.DATA};
Cursor cursor = context.getContentResolver().query(contentUri, proj, null, null, null);
int column_index = 0;
String result = "";
if (cursor != null) {
column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
result = cursor.getString(column_index);
cursor.close();
return result;
}
return result;
}
/**
* Get a file path from a Uri. This will get the path for Storage Access
* Framework Documents, as well as the _data field for the MediaStore and
* other file-based ContentProviders.
*
* #param context The context.
* #param uri The Uri to query.
* #author paulburke
*/
#SuppressLint("NewApi")
public static String getRealPathFromURI_API19(final Context context, final Uri uri) {
final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
// DocumentProvider
if (isKitKat && 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];
}*/
// This is for checking Main Memory
if ("primary".equalsIgnoreCase(type)) {
if (split.length > 1) {
return Environment.getExternalStorageDirectory() + "/" + split[1];
} else {
return Environment.getExternalStorageDirectory() + "/";
}
// This is for checking SD Card
} else {
return "storage" + "/" + docId.replace(":", "/");
}
// TODO handle non-primary volumes
}
// DownloadsProvider
else if (isDownloadsDocument(uri)) {
final String id = DocumentsContract.getDocumentId(uri);
if (!TextUtils.isEmpty(id)) {
if (id.startsWith("raw:")) {
return id.replaceFirst("raw:", "");
}
}
//final Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
//return getDataColumn(context, contentUri, null, null);
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));
/* final Uri contentUri = ContentUris.withAppendedId(
Uri.parse("content://downloads/public_downloads"), 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:", "");
}
}
}
// 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;
} else if ("document".equals(type)) {
contentUri = MediaStore.Files.getContentUri("external", Long.valueOf(split[1]));
// return Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS).getPath() + "/" + split[1];
// return "content://com.android.providers.media.documents/document/"+split[1];
}
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;
}
/**
* Get the value of the data column for this Uri. This is useful for
* MediaStore Uris, and other file-based ContentProviders.
*
* #param context The context.
* #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(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) {
return null;
} finally {
if (cursor != null)
cursor.close();
}
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());
}
/**
* #param uri The Uri to check.
* #return Whether the Uri authority is Google Photos.
*/
public static boolean isGooglePhotosUri(Uri uri) {
return "com.google.android.apps.photos.content".equals(uri.getAuthority());
}
}
Issue: not able to get a file's real path in Android 11 and above; it's working fine up to Android 10. If I choose a file from another location (example: documents, internal storage), it's working in Android 11 and above, but not working if I choose a file from download folders.
Sample path:
Uri: content://com.android.providers.media.documents/document/document%3A36
ABS Path: /document/document:36 -->not able to get real path
Actual Path: storage/1216-330D/Documents/sample.pdf
I missed to do this (working fine after adding below code)
private String copyFileToInternal(Uri fileUri) {
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
Cursor cursor = getContentResolver().query(fileUri, new String[]{OpenableColumns.DISPLAY_NAME, OpenableColumns.SIZE}, null, null);
cursor.moveToFirst();
String displayName = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));
long size = cursor.getLong(cursor.getColumnIndex(OpenableColumns.SIZE));
File file = new File(getFilesDir() + "/" + displayName);
try {
FileOutputStream fileOutputStream = new FileOutputStream(file);
InputStream inputStream = getContentResolver().openInputStream(fileUri);
byte buffers[] = new byte[1024];
int read;
while ((read = inputStream.read(buffers)) != -1) {
fileOutputStream.write(buffers, 0, read);
}
inputStream.close();
fileOutputStream.close();
return file.getPath();
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
Finally I got the answer, download PDF file and save using below path/code and get Uri from the path and share it, it is working fine upto Android 12
String dirPath;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
dirPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS).getAbsolutePath() + "/" + getString(R.string.app_name) + "/";
} else {
dirPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + getString(R.string.app_name) + "/";
}

SSL Exception when uploading pdf files

I am implementing file uploading concept through gallery,camera and filemanager.
Here is the code
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
if (requestCode == 1) {
Bitmap photo = (Bitmap) data.getExtras().get("data");
// CALL THIS METHOD TO GET THE URI FROM THE BITMAP
Uri tempUri = getImageUri(getApplicationContext(), photo);
// CALL THIS METHOD TO GET THE ACTUAL PATH
File finalFile = new File(getRealPathFromURI(tempUri));
suppdocs.setText(strPath);
} else if (requestCode == 2) {
Bitmap bm=null;
if (data != null) {
try {
bm = MediaStore.Images.Media.getBitmap(getApplicationContext().getContentResolver(), data.getData());
} catch (IOException e) {
e.printStackTrace();
}
}
Uri tempUri = getImageUri(getApplicationContext(), bm);
File finalFile = new File(getRealPathFromURI(tempUri));
suppdocs.setText(strPath);
} else if (requestCode == 3) {
Uri uri = data.getData();
strPath= getPath(getApplicationContext(),uri);
suppdocs.setText(strPath);
}
}
}
Here is the code to get path for selected file from filemanager
public static String getPath(final Context context, final Uri uri) {
final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
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];
}
} 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);
} 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);
}
} else if ("content".equalsIgnoreCase(uri.getScheme())) {
return getDataColumn(context, uri, null, null);
} else if ("file".equalsIgnoreCase(uri.getScheme())) {
return uri.getPath();
}
return null;
}
//Here is the code of sending file to server
private void senddata1(final String path) {
if(common.isNetworkAvailable(getApplicationContext())) {
try {
Log.d("TestTag","filename : "+path+" file : "+strfile);
progressBar2.setVisibility(View.VISIBLE);
submit_btn.setVisibility(View.GONE);
File file = new File(path);
// Parsing any Media type file
RequestBody requestBody = RequestBody.create(MediaType.parse("*/*"), file);
MultipartBody.Part fileToUpload = MultipartBody.Part.createFormData("file", file.getName(), requestBody);
RequestBody filename = RequestBody.create(MediaType.parse("text/plain"), file.getName());
RequestBody strgid = RequestBody.create(MediaType.parse("text/plain"),gid);
RequestBody key = RequestBody.create(MediaType.parse("text/plain"),strKey);
APIService getResponse = apiclient.imgUpload().create(APIService.class);
Call<ImageUpload> call = getResponse.uploadFile(fileToUpload,filename);
call.enqueue(new Callback<ImageUpload>() {
#Override
public void onResponse(Call<ImageUpload> call, Response<ImageUpload> response) {
progressBar2.setVisibility(View.GONE);
submit_btn.setVisibility(View.VISIBLE);
if (response.isSuccessful()) {
String message=response.body().getMessage();
String type=response.body().getType();
}
}
#Override
public void onFailure(Call<ImageUpload> call, Throwable t) {
Log.d("TestTag","throwable : "+t);
common.showtoast("Failed to upload image.",getApplicationContext());
}
});
} catch (Exception e) {
Log.d("TestTag","exception : "+e);
}
}
}
I tried to upload images to server through camera,gallery and filemanager its working properly but when i select pdf file through filemanage i am getting SSL Exception.
Expected output:
If i select pdf files through file manager it should upload pdf files properly

How to get a path of image (URI) and send it to database?

I have a code to get an image if I click the button, in my problem, I wanna get the URI/path of the image and send it into the database, after that I wanna show it in ImageView. And this is my code.
#Override
public void onActivityResult(int req, int res, Intent imageIntent) {
super.onActivityResult(req, res, imageIntent);
switch (req) {
case SELECT_ICON:
if (res == RESULT_OK) {
try {
final Uri iconUri = imageIntent.getData();
final String imgUri = iconUri.toString();
final InputStream iconStream = getContentResolver().openInputStream(iconUri);
final Bitmap selectedIcon = BitmapFactory.decodeStream(iconStream);
imageView.setImageBitmap(selectedIcon);
saveButton.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View arg0) {
String tname = text1.getText().toString();
String date = textView.getText().toString();
String priority = spinner1.getSelectedItem().toString();
String notes = text2.getText().toString();
String path = imgUri;
dbHelper.addTask(new Task(tname, date, priority, notes, path));
Toast.makeText(getApplicationContext(), "Success!!!", Toast.LENGTH_LONG).show();
TaskListActivity.tasklist.RefreshList();
finish();
}
});
} catch (FileNotFoundException err) {
err.printStackTrace();
}
}
}
}
You can use String strUri = uri.toString() to convert Uri to String save this strUri to database and while retrieving from database you can use Uri uri = Uri.parse(strUri) for converting string back to Uri
I used these methods to get path from URI
private String getActualFilePath(Context context, Uri fileUri) throws URISyntaxException{
Uri uri = Uri.parse(fileUri);
final boolean needToCheckUri = Build.VERSION.SDK_INT >= 19;
String selection = null;
String[] selectionArgs = null;
// Uri is different in versions after KITKAT (Android 4.4), we need to
// deal with different Uris.
if (needToCheckUri && DocumentsContract.isDocumentUri(context.getApplicationContext(), uri)) {
if (isExternalStorageDocument(uri)) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
return Environment.getExternalStorageDirectory() + "/" + split[1];
} else if (isDownloadsDocument(uri)) {
final String id = DocumentsContract.getDocumentId(uri);
uri = ContentUris.withAppendedId(
Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
} else if (isMediaDocument(uri)) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];
if ("image".equals(type)) {
uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
} else if ("video".equals(type)) {
uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
} else if ("audio".equals(type)) {
uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
}
selection = "_id=?";
selectionArgs = new String[]{ split[1] };
}
}
if ("content".equalsIgnoreCase(uri.getScheme())) {
String[] projection = { MediaStore.Images.Media.DATA };
Cursor cursor = null;
try {
cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null);
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
if (cursor.moveToFirst()) {
return cursor.getString(column_index);
}
} catch (Exception e) {
}
} else if ("file".equalsIgnoreCase(uri.getScheme())) {
return uri.getPath();
}
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());
}
private void LogException(Exception ex){
if(ex != null){
try{
ex.printStackTrace(logPrintWriter);
String data = logStringWriter.toString();
AddErrorLogEntry(data);
}finally {
Log.d(TAG, "Logged exception in file");
}
}
}

How can I get File from URI in Android?

I am trying to read a PDF file but it's throwing a NoSuchFileException. I have seen some solution for this but nothing seems to work in my case. I want to read the PDF file. Below is my code:
private void requestForResume() {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("*/*");
intent.addCategory(Intent.CATEGORY_OPENABLE);
Intent chooser = Intent.createChooser(intent, "Upload PDF File");
startActivityForResult(chooser, REQUEST_CODE);
}
Here is how I am converting to file:
#Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE) {
Uri uri = data.getData();
String fileName = uri.getLastPathSegment();
File resumeFile=new File(uri.getPath());
try {
PDDocument pdfResume=PDDocument.load(resumeFile);
PDFTextStripper stripper=new PDFTextStripper();
String resumeText=stripper.getText(pdfResume);
Log.d("location",resumeText);
} catch (IOException e) {
Log.d("location","unable to load pdf"+e.toString());
}
fileEditText.setText(fileName);
}
}
Please help me where I am wrong.
use this it return you path put just it on File
#SuppressLint("NewApi")
public static String getFilePath(Context context, Uri uri) throws URISyntaxException {
String selection = null;
String[] selectionArgs = null;
// Uri is different in versions after KITKAT (Android 4.4), we need to
if (Build.VERSION.SDK_INT >= 19 && DocumentsContract.isDocumentUri(uri)) {//DocumentsContract.isDocumentUri(context.getApplicationContext(), uri))
if (isExternalStorageDocument(uri)) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
return Environment.getExternalStorageDirectory() + "/" + split[1];
} else if (isDownloadsDocument(uri)) {
final String id = DocumentsContract.getDocumentId(uri);
uri = ContentUris.withAppendedId(
Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
} else if (isMediaDocument(uri)) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];
if ("image".equals(type)) {
uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
} else if ("video".equals(type)) {
uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
} else if ("audio".equals(type)) {
uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
}
selection = "_id=?";
selectionArgs = new String[]{
split[1]
};
}
}
if ("content".equalsIgnoreCase(uri.getScheme())) {
String[] projection = {
MediaStore.Images.Media.DATA
};
Cursor cursor = null;
try {
cursor = context.getContentResolver()
.query(uri, projection, selection, selectionArgs, null);
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
if (cursor.moveToFirst()) {
return cursor.getString(column_index);
}
} catch (Exception e) {
}
} else if ("file".equalsIgnoreCase(uri.getScheme())) {
return uri.getPath();
}
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());
}
File file =new File(getFilePath(getApplicationContext(),data.getData()));

Android open failed: EACCES (Permission denied) when try to read a file in data/data

I need to read a file selected by user, so I use this code:
//This code is called by a button to ask the permission
private void startUpload(){
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, WRITE_PERMISSION_GRANTED);
} else {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, WRITE_PERMISSION_GRANTED);
}
}
}//startUpload
I put the relative permission in the manifest too:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
I read the file in this way:
#Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case WRITE_PERMISSION_GRANTED: {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
try {
FileInputStream stream = new FileInputStream(toUpload.getCanonicalFile());
byte[] data = new byte[(int) toUpload.length()];
stream.read(data);
stream.close();
Log.e("FUNZIONA!!!!", "OK!");
}catch (Exception e){
Log.e("ECCEZIONE", e.getMessage());
}
} else {
Log.e("PERMISSION", "DEINED");
}
return;
}
// other 'case' lines to check for other
// permissions this app might request
}
}
(toUpload is a file selected by the user with the file manager, in this case a downloaded image)
With the code I get this exception:
/data/data/com.android.browser/cache/2016-04-25-17-17-49-1205395195.jpg: open failed: EACCES (Permission denied)
I don't know what the problem is.
I add some details:
//this code opens the defualt file manager
private void showFileChooser() {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("*/*");
intent.addCategory(Intent.CATEGORY_OPENABLE);
try {
startActivityForResult(
Intent.createChooser(intent, "Select a File to Upload"),
FILE_SELECT_CODE);
} catch (android.content.ActivityNotFoundException ex) {
Snackbar.make(uploadView, "Nessun file manager trovato!", Snackbar.LENGTH_LONG).setAction("Response", null).show();
}
}//showFileChooser
//this is for getting the selected file
#Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case FILE_SELECT_CODE:
if (resultCode == RESULT_OK) {
Uri uri = data.getData();
String path = getPath(this, uri);
toUpload = new File(path);
//Log.d("LOG", "File Path: " + path);
}
break;
}
super.onActivityResult(requestCode, resultCode, data);
}//onActivityResult
And this is the code to get the path:
private String getPath(final Context context, final Uri uri) {
final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
// DocumentProvider
if (isKitKat && 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;
}//getPath
public 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);
}
} finally {
if (cursor != null)
cursor.close();
}
return null;
}//getDataColumn
public static boolean isExternalStorageDocument(Uri uri) {
return "com.android.externalstorage.documents".equals(uri.getAuthority());
}//isExternalStorageDocument
public static boolean isDownloadsDocument(Uri uri) {
return "com.android.providers.downloads.documents".equals(uri.getAuthority());
}//isDownloadsDocument
public static boolean isMediaDocument(Uri uri) {
return "com.android.providers.media.documents".equals(uri.getAuthority());
}//isMediaDocument
public static boolean isGooglePhotosUri(Uri uri) {
return "com.google.android.apps.photos.content".equals(uri.getAuthority());
}//isMediaDocument
What is wrong?
You are not the author of the com.android.browser app. You cannot access that app's files on internal storage. Your permissions are for external storage.
ok, I solved it! The problem was in part the emulator ... I post the code for those who had the same problem (thanks to CommonsWare for help):
//It requires a file manager installed
private void showFileChooser() {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("file/*");
try {
startActivityForResult(intent, FILE_SELECT_CODE);
} catch (android.content.ActivityNotFoundException ex) {
Snackbar.make(uploadView, "No file manager founded!", Snackbar.LENGTH_LONG).setAction("Response", null).show();
}
}//showFileChooser
#Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case FILE_SELECT_CODE:
if (resultCode == RESULT_OK) {
Uri uri = data.getData();
uriToUpload = uri;
}
break;
}
super.onActivityResult(requestCode, resultCode, data);
}//onActivityResult
private byte[] getFileData() throws IOException{
Cursor cursor = getContentResolver().query(uriToUpload, null, null, null, null);
cursor.moveToFirst();
long size = cursor.getLong(cursor.getColumnIndex(OpenableColumns.SIZE));
cursor.close();
InputStream stream = getContentResolver().openInputStream(uriToUpload);
byte[] data = new byte[(int)size];
stream.read(data);
stream.close();
return data;
}//getFileData

Categories