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
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) + "/";
}
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
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");
}
}
}
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()));
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