How to Get File Path from URI in Android Oreo (8.1) or above
For now, the best approach for getting path is :
Getting physical file from URI as InputStream,
ContentResolver.openInputStream()
allow you to access the contents of a file without knowing its real path
String id = DocumentsContract.getDocumentId(uri);
InputStream inputStream = getContentResolver().openInputStream(uri);
then write it as a temporary file in cached storage
File file = new File(getCacheDir().getAbsolutePath()+"/"+id);
writeFile(inputStream, file);
String filePath = file.getAbsolutePath();
Here is the method to write temporary file into cached storage
void writeFile(InputStream in, File file) {
OutputStream out = null;
try {
out = new FileOutputStream(file);
byte[] buf = new byte[1024];
int len;
while((len=in.read(buf))>0){
out.write(buf,0,len);
}
} catch (Exception e) {
e.printStackTrace();
}
finally {
try {
if ( out != null ) {
out.close();
}
in.close();
} catch ( IOException e ) {
e.printStackTrace();
}
}
}
Not sure if its the best way to do, but the code is working properly :D
this is activity instance variable
*************************************************************************
*************************************************************************
Uri filePath;
String strAttachmentFileName = "",//attached file name
strAttachmentCoded = "";//attached file in byte code Base64
int PICK_REQUEST =1;
*************************************************************************
*************************************************************************
this is in activity method
*************************************************************************
*************************************************************************
Button buttonChoose.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setType("file/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select any file"), PICK_REQUEST );
}
});
*************************************************************************
*************************************************************************
this is overrride activity method
*************************************************************************
*************************************************************************
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == PICK_REQUEST && resultCode == Activity.RESULT_OK && data != null && data.getData() != null) {
filePath = data.getData();
File uploadFile = new File(FileUtils.getRealPath(activity.this, filePath));
try {
if (uploadFile != null) {
strAttachmentFileName = uploadFile.getName();
FileInputStream objFileIS = new FileInputStream(uploadFile);
ByteArrayOutputStream objByteArrayOS = new ByteArrayOutputStream();
byte[] byteBufferString = new byte[1024];
int readNum;
readNum = objFileIS.read(byteBufferString);
while (readNum != -1) {
objByteArrayOS.write(byteBufferString, 0, readNum);
readNum = objFileIS.read(byteBufferString);
}
strAttachmentCoded = Base64.encodeToString(objByteArrayOS.toByteArray(), Base64.DEFAULT);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
*************************************************************************
*************************************************************************
Please create file FileUtils.java as below
link HBiSoft
For Any Type of File in .Net ---
byte[] p = Convert.FromBase64String("byte string");
MemoryStream ms = new MemoryStream(p);
FileStream fs = new FileStream
(System.Web.Hosting.HostingEnvironment.MapPath("~/ComplaintDetailsFile/") +
item.FileName, FileMode.Create);
ms.WriteTo(fs);
ms.Close();
fs.Close();
fs.Dispose();