How to get absolute path when select image from gallery and SD Card (Kitkat and lower android version)?
In Kitkat version we get different Uri format(DocumentProvider)
Now Uri format like this : content://com.android.providers.media.documents/document/image:3951
Before Uri format like this : content://media/external/images/media/3951.
1. AbsolutePathActivity.java Activity Class
import
android.app.Activity;
import
android.content.Intent;
import
android.net.Uri;
import
android.os.Bundle;
import
android.util.Log;
import
android.view.View;
import
android.view.View.OnClickListener;
import
android.widget.Button;
import
android.widget.TextView;
public
class
AbsolutePathActivity
extends
Activity
{
private
static
final
int
MY_INTENT_CLICK=
302
;
private
TextView txta;
private
Button btn_selectImage;
@Override
protected
void
onCreate(Bundle savedInstanceState)
{
super
.onCreate(savedInstanceState);
setContentView(R.layout.activity_absolutepath);
txta = (TextView) findViewById(R.id.textView1);
btn_selectImage = (Button) findViewById(R.id.btn_selectImage);
btn_selectImage.setOnClickListener(
new
OnClickListener()
{
@Override
public
void
onClick(View v)
{
Intent intent =
new
Intent();
intent.setType(
"*/*"
);
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent,
"<span class="
IL_AD
" id="
IL_AD2
">Select</span> File"
),MY_INTENT_CLICK);
}
});
}
@Override
public
void
onActivityResult(
int
requestCode,
int
resultCode, Intent data)
{
if
(resultCode == RESULT_OK)
{
if
(requestCode == MY_INTENT_CLICK)
{
if
(
null
== data)
return
;
String selectedImagePath;
Uri selectedImageUri = data.getData();
//MEDIA GALLERY
selectedImagePath = ImageFilePath.getPath(getApplicationContext(), selectedImageUri);
Log.i(
"Image File Path"
,
""
+selectedImagePath);
txta.setText(
"File Path : \n"
+selectedImagePath);
}
}
}
}
Copy below class on your application for getting Gallery image file Uri AbsolutePath.
2.ImageFilePath.java
2.ImageFilePath.java
import
android.content.ContentUris;
import
android.content.Context;
import
android.database.Cursor;
import
android.net.Uri;
import
android.os.Build;
import
android.os.Environment;
import
android.provider.DocumentsContract;
import
android.provider.MediaStore;
public
class
ImageFilePath
{
/**
* <span class="IL_AD" id="IL_AD11">Method</span> for return file path of Gallery image
*
* @param context
* @param uri
* @return path of the selected image file from gallery
*/
public
static
String getPath(
final
Context context,
final
Uri uri)
{
//check here to KITKAT or new version
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(
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
;
}
/**
* Get the <span class="IL_AD" id="IL_AD10">value</span> 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 <span class="IL_AD" id="IL_AD7">arguments</span> 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);
}
} <span
class
=
"IL_AD"
id=
"IL_AD12"
>
finally
</span> {
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());
}
}
3. activity_absolutepath.xml layout file
<LinearLayout xmlns:android=
"http://schemas.android.com/apk/res/android"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:orientation=
"vertical"
android:padding=
"30dp"
>
<TextView
android:id=
"@+id/textView"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:text=
"Example code for get absolute path when select image from gallery"
android:textSize=
"14sp"
android:textStyle=
"bold"
/>
<Button
android:id=
"@+id/btn_selectImage"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginBottom=
"10dp"
android:layout_marginTop=
"10dp"
android:text=
"Select Image"
/>
<TextView
android:id=
"@+id/textView1"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginTop=
"10dp"
android:textSize=
"14sp"
android:textStyle=
"bold"
/>
</LinearLayout>
4. AndroidManifest.xml file
<?xml version=
"1.0"
encoding=
"utf-8"
?>
<manifest xmlns:android=
"http://schemas.android.com/apk/res/android"
package
=
"com.limbani.masterapp"
android:versionCode=
"1"
android:versionName=
"1.0"
>
<uses-permission android:name=
"android.permission.WRITE_EXTERNAL_STORAGE"
/>
<uses-sdk
android:minSdkVersion=
"8"
android:targetSdkVersion=
"19"
/>
<application
android:allowBackup=
"true"
android:icon=
"@drawable/ic_launcher"
android:label=
"@string/app_name"
android:theme=
"@style/AppTheme"
>
<activity
android:name=
"com.limbani.masterapp.AbsolutePathActivity"
>
<intent-filter>
<action android:name=
"android.intent.action.MAIN"
/>
<category android:name=
"android.intent.category.LAUNCHER"
/>
</intent-filter>
</activity>
</application>
</manifest>
Original post here, this is just for my reference only to getting quick code for my project.
Happy to help you :)
No comments:
Post a Comment