I have use the pesdk library to edit an image.
public static int GALLERY_RESULT = 2;
private void selectImgtoEdit() {
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(path));
startActivityForResult(intent, GALLERY_RESULT);
}
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
Uri selectedImage = intent.getData();
openEditor(selectedImage);
}
public void openEditor(Uri inputImage) {
SettingsList settingsList = createPesdkSettingsList();
// Set input image
settingsList.getSettingsModel(LoadSettings.class).setSource(inputImage);
settingsList.getSettingsModel(PhotoEditorSaveSettings.class).setOutputToGallery(Environment.DIRECTORY_DCIM);
new PhotoEditorBuilder(this).setSettingsList(settingsList).startActivityForResult(this, PESDK_RESULT);
}
I want to use that library with the absolute path of an image. How can I setting it ?
You should convert absolute path to content uri.
For example
Below Android P
public static Uri getImageContentUri(Context context, File imageFile) {
String filePath = imageFile.getAbsolutePath();
Cursor cursor = context.getContentResolver().query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
new String[] { MediaStore.Images.Media._ID },
MediaStore.Images.Media.DATA + "=? ",
new String[] { filePath }, null);
if (cursor != null && cursor.moveToFirst()) {
int id = cursor.getInt(cursor.getColumnIndex(MediaStore.MediaColumns._ID));
cursor.close();
return Uri.withAppendedPath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "" + id);
} else {
if (imageFile.exists()) {
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.DATA, filePath);
return context.getContentResolver().insert(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
} else {
return null;
}
}
}
Above Android Q
public static Uri getImageContentUri(Context context, File imageFile) {
String filePath = imageFile.getAbsolutePath();
Cursor cursor = context.getContentResolver().query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
new String[]{MediaStore.Images.Media._ID},
MediaStore.Images.Media.DATA + "=? ",
new String[]{filePath}, null);
if (cursor != null && cursor.moveToFirst()) {
int id = cursor.getInt(cursor.getColumnIndex(MediaStore.MediaColumns._ID));
cursor.close();
return Uri.withAppendedPath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "" + id);
} else {
if (imageFile.exists()) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
ContentResolver resolver = context.getContentResolver();
Uri picCollection = MediaStore.Images.Media
.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY);
ContentValues picDetail = new ContentValues();
picDetail.put(MediaStore.Images.Media.DISPLAY_NAME, imageFile.getName());
picDetail.put(MediaStore.Images.Media.MIME_TYPE, "image/jpg");
picDetail.put(MediaStore.Images.Media.RELATIVE_PATH,"DCIM/" + UUID.randomUUID().toString());
picDetail.put(MediaStore.Images.Media.IS_PENDING,1);
Uri finaluri = resolver.insert(picCollection, picDetail);
picDetail.clear();
picDetail.put(MediaStore.Images.Media.IS_PENDING, 0);
resolver.update(picCollection, picDetail, null, null);
return finaluri;
}else {
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.DATA, filePath);
return context.getContentResolver().insert(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
}
} else {
return null;
}
}
}
Do you have the absolute path of the image?
I suggest code like below, try again...
String filepath = "/storage/emulated/0/image.jpg";
Uri selectedUri = getImageContentUri(context, new File(filepath));
openEditor(selectedUri);
Use second getImageContentUri function in above answer.
Related
i am very new to android and coding and i am stuck here.i have a gridview that is showing images from my SDCard. but my gridview not showing anything.
My Uri looks like as below:
[content://com.android.providers.media.documents/document/image%3A252,content://com.android.providers.media.documents/document/image%3A68,content://com.android.providers.media.documents/document/image%3A67,content://com.android.providers.media.documents/document/image%3A172]
i have tried many ways to convert this uri to actual path but nothing work for me
i tried this code but it leads to crash my app:
public String getRealPathFromURI (Uri contentUri) {
String path = null;
String[] proj = { MediaStore.MediaColumns.DATA };
Cursor cursor = getContentResolver().query(contentUri, proj, null, null, null);
if (cursor.moveToFirst()) {
int column_index = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA);
path = cursor.getString(column_index);
}
cursor.close();
return path;
}
screen shot
this is how i open gallery:
btnGallery.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setType("image/*");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
}
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent,"Select Picture"), SELECT_IMAGE);
}
});
This onActivityResult() Method code:
if (requestCode == PICK_IMAGE_MULTIPLE && resultCode == RESULT_OK && null != data) {
// Get the Image from data
String[] filePathColumn = {MediaStore.Images.Media.DATA};
imagesEncodedList = new ArrayList<String>();
if (data.getData() != null) {
Uri mImageUri = data.getData();
// Get the cursor
Cursor cursor = getContentResolver().query(mImageUri, filePathColumn, null, null, null);
// Move to first row
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
imageEncoded = cursor.getString(columnIndex);
cursor.close();
ArrayList<Uri> mArrayUri = new ArrayList<Uri>();
mArrayUri.add(mImageUri);
uriImage = mArrayUri.toString();// this string i store in sqlite
galleryAdapter = new GalleryAdapter(getApplicationContext(), mArrayUri);
gvGallery.setAdapter(galleryAdapter);
gvGallery.setVerticalSpacing(gvGallery.getHorizontalSpacing());
ViewGroup.MarginLayoutParams mlp = (ViewGroup.MarginLayoutParams) gvGallery.getLayoutParams();
mlp.setMargins(0, gvGallery.getHorizontalSpacing(), 0, 0);
} else {
if (data.getClipData() != null) {
ClipData mClipData = data.getClipData();
ArrayList<Uri> mArrayUri = new ArrayList<Uri>();
for (int i = 0; i < mClipData.getItemCount(); i++) {
ClipData.Item item = mClipData.getItemAt(i);
Uri uri = item.getUri();
mArrayUri.add(uri);
uriImage = mArrayUri.toString();//this string store in sqlite
// Get the cursor
Cursor cursor = getContentResolver().query(uri, filePathColumn, null, null, null);
// Move to first row
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
imageEncoded = cursor.getString(columnIndex);
imagesEncodedList.add(imageEncoded);
cursor.close();
galleryAdapter = new GalleryAdapter(getApplicationContext(), mArrayUri);
gvGallery.setAdapter(galleryAdapter);
gvGallery.setVerticalSpacing(gvGallery.getHorizontalSpacing());
ViewGroup.MarginLayoutParams mlp = (ViewGroup.MarginLayoutParams) gvGallery
.getLayoutParams();
mlp.setMargins(0, gvGallery.getHorizontalSpacing(), 0, 0);
}
Log.v("LOG_TAG", "Selected Images" + mArrayUri.size());
}
}
} else if (resultCode == this.RESULT_CANCELED) {
Toast.makeText(this, "Cancelled", Toast.LENGTH_SHORT).show();
}
this is how i get string from sqlite in Adapterclass:
final String image_string = product.getFimage();//get string from sqlite
and send to share prefrence:
SharedPreferences settings = mCtx.getSharedPreferences("image_My_str", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = settings.edit();
editor.putString("img_str", image_string);
editor.commit();
In my display activity i get this string from Shared preference:
SharedPreferences settings = getSharedPreferences("image_My_str", Context.MODE_PRIVATE);
String encodedImage = settings.getString("img_str", "");
and here i convert that string to URi:
Uri mImageUri = Uri.parse(encodedImage);
Log.d("LOG_TAG", "Images URI " + mImageUri);
try {
inputStream = getApplicationContext().getContentResolver().openInputStream(mImageUri);
Log.d("LOG_TAG", "Images File " + inputStream);
bitmap = BitmapFactory.decodeStream(inputStream);
Log.d("LOG_TAG", "Images bitmap " + bitmap);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
if (bitmap != null) {
img.setImageBitmap(bitmap);
}else {
Toast.makeText(EditMapsActivity.this, "image not found", Toast.LENGTH_LONG).show();
}
My URI looks like:
[content://com.android.providers.media.documents/document/image%3A252,content://com.android.providers.media.documents/document/image%3A68,content://com.android.providers.media.documents/document/image%3A67,content://com.android.providers.media.documents/document/image%3A172]
I created my OwnCloud server with Oracle VirtualBox Debian. I want my Android application to upload image to the cloud. So i created intent to get image from the Gallery and to upload it with the OwnCloud Android library from GitHub: https://github.com/owncloud/android-library
. I followed the steps from the sample but every time when i start uploading, the result is 404 - FILE_NOT_FOUND
Here is a snippet of my code:
floatingActionButton.setOnClickListener(v -> {
Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
photoPickerIntent.setType(IMAGE_INTENT);
startActivityForResult(photoPickerIntent, RESULT_LOAD_IMG);
});
}
#Override
protected void onActivityResult(int reqCode, int resultCode, Intent data) {
super.onActivityResult(reqCode, resultCode, data);
if (resultCode == RESULT_OK) {
try {
final Uri imageUri = data.getData();
final InputStream imageStream = getContentResolver().openInputStream(imageUri);
final Bitmap selectedImage = BitmapFactory.decodeStream(imageStream);
profilePicture.setImageBitmap(selectedImage);
File file = new File(getRealPathFromURI(imageUri));
Log.d("Image file", file.getAbsolutePath() + "\t" + file.getName());
handler = new Handler();
Uri serverUri = Uri.parse("http://192.168.1.8/remote.php/webdav/");
client = OwnCloudClientFactory.createOwnCloudClient(serverUri, this, true);
client.setCredentials(OwnCloudCredentialsFactory.newBasicCredentials("user", "bitnami"));
client.getParams().setAuthenticationPreemptive(true);
String remotePath = FileUtils.PATH_SEPARATOR + file.getName();
String mimeType = "image/png";
// Get the last modification date of the file from the file system
Long timeStampLong = file.lastModified() / 1000;
String timeStamp = timeStampLong.toString();
UploadRemoteFileOperation uploadOperation = new UploadRemoteFileOperation(file.getAbsolutePath(), remotePath, mimeType, timeStamp);
uploadOperation.addDatatransferProgressListener(this);
uploadOperation.execute(client, this, handler);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
private String getRealPathFromURI(Uri contentURI) {
String result;
Cursor cursor = getContentResolver().query(contentURI, null, null, null, null);
if (cursor == null) {
result = contentURI.getPath();
} else {
cursor.moveToFirst();
int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
result = cursor.getString(idx);
cursor.close();
}
return result;
}
#Override
public void onTransferProgress(long progressRate, long totalTransferredSoFar, long totalToTransfer, String fileAbsoluteName) {
final long percentage = (totalToTransfer > 0 ? totalTransferredSoFar * 100 / totalToTransfer : 0);
handler.post(() -> Log.d("Progress", "progressRate " + percentage));
}
#Override
public void onRemoteOperationFinish(RemoteOperation caller, RemoteOperationResult result) {
Toast.makeText(this, String.valueOf(result.getHttpCode()), Toast.LENGTH_SHORT).show();
}
I can change image with local picker (not camera) and set it to imageview (profile_image) like this :
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
if (requestCode == SELECT_PICTURE) {
Uri selectedImageUri = data.getData();
//selectedImagePath = getPath(selectedImageUri);
//Utils.log("selectedImagePath: " + selectedImagePath);
Utils.log("selectedImageUri: " + selectedImageUri);
profile_image.setImageURI(selectedImageUri);
final int takeFlags = data.getFlags()
& (Intent.FLAG_GRANT_READ_URI_PERMISSION
| Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
String id = selectedImageUri.getLastPathSegment().split(":")[1];
final String[] imageColumns = {MediaStore.Images.Media.DATA };
final String imageOrderBy = null;
Uri uri = getUri();
String selectedImagePath = "path";
Cursor imageCursor = managedQuery(uri, imageColumns,
MediaStore.Images.Media._ID + "="+id, null, imageOrderBy);
if (imageCursor.moveToFirst()) {
selectedImagePath = imageCursor.getString(imageCursor.getColumnIndex(MediaStore.Images.Media.DATA));
new LocalImageUpload().execute(selectedImagePath);
}
Utils.log("selectedImagePath:" + selectedImagePath); // use selectedImagePath
}else{
Uri uri = data.getData();
String[] projection = { MediaStore.Images.Media.DATA };
Cursor cursor = getContentResolver().query(uri, projection, null, null, null);
cursor.moveToFirst();
Utils.log("DatabaseUtils:" + DatabaseUtils.dumpCursorToString(cursor));
int columnIndex = cursor.getColumnIndex(projection[0]);
String picturePath = cursor.getString(columnIndex); // returns null
cursor.close();
}
}
}
I got selectedImageUri with Utils.log("selectedImageUri: " + selectedImageUri);, but I got null when log Utils.log("selectedImagePath: " + selectedImagePath);
Update: I change like that and already got selectedImagePath. commented old selectedImagePath.
So I want to upload image to database after profile_image.setImageURI(selectedImageUri); , how to upload local image picker to database? I mean the background proccess POST code?
Can you please try below one ?
Pass Uri as argument in below function and get Path from Uri.
private String getRealPathFromURI (Uri contentUri) {
String path = null;
String[] proj = { MediaStore.MediaColumns.DATA };
Cursor cursor = getContentResolver().query(contentUri, proj, null, null, null);
if (cursor.moveToFirst()) {
int column_index = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA);
path = cursor.getString(column_index);
}
cursor.close();
return path;
}
Now set Bitmap on ImageView using below code:
String mRealPath = getRealPathFromURI(your_uri);
Bitmap bmImg = BitmapFactory.decodeFile(mRealPath);
imageView.setImageBitmap(bmImg);
Edit:
Now you have to pass an argument for your Async Task:
new LocalImageUpload().execute(mRealPath);
Hope this will help you.
Image is not importing, every time when I pic image from gallery in Android.
Intent i = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(i, LOAD_IMAGE_RESULTS);
super.onActivityResult(requestCode, resultCode, data);
BitmapFactory.Options BitmapFactoryOptionsbfo = new BitmapFactory.Options();
BitmapFactoryOptionsbfo.inPreferredConfig = Bitmap.Config.RGB_565;
if (requestCode == LOAD_IMAGE_RESULTS && resultCode == RESULT_OK
&& data != null) {
imgUri = data.getData();
// Let's read picked image path using content resolver
String[] filePath = { MediaStore.Images.Media.DATA };
Cursor cursor = getContentResolver().query(imgUri, filePath, null,
null, null);
cursor.moveToFirst();
String imagePath = cursor.getString(cursor
.getColumnIndex(filePath[0]));
bmp = BitmapFactory.decodeFile(imagePath);
cursor.close();
}
image is not importing every time ,some bmp sets nothing on imageview.
how to get image from gallery which supports for API>=19 & API<19 both...
This code'll solve the problem for SDK < API11, SDK >= 11 && SDK < 19 and SDK > 19
Declare it Globally
public final int GALLERY_PHOTO = 2;
Bitmap newbitmap;
private Uri fileUri;
Use this Method to Start Image chooser
public void callGallery() {
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select Picture"),
GALLERY_PHOTO);
}
Use this condition in Default #Overide onActivityResult(int requestCode, int resultCode, Intent data)
if (requestCode == GALLERY_PHOTO) {
if (resultCode == RESULT_OK) {
// SDK < API11
if (Build.VERSION.SDK_INT < 11) {
try {
realPath = RealPathUtil.getRealPathFromURI_BelowAPI11(
Yourclassname.this,
data.getData());
setTextViews(Build.VERSION.SDK_INT, data.getData()
.getPath(), realPath);
} catch (Exception e) {
e.printStackTrace();
Uri selectedImage = data.getData();
String[] filePathColumn = { MediaStore.Images.Media.DATA };
Cursor cursor = getContentResolver()
.query(selectedImage, filePathColumn, null,
null, null);
cursor.moveToFirst();
int columnIndex = cursor
.getColumnIndex(filePathColumn[0]);
String filePath = cursor.getString(columnIndex);
cursor.close();
newbitmap = BitmapFactory.decodeFile(filePath);
imageview.setImageBitmap(newbitmap);
}
}
// SDK >= 11 && SDK < 19
else if (Build.VERSION.SDK_INT < 19) {
try {
realPath = RealPathUtil.getRealPathFromURI_API11to18(
yourclassname.this,
data.getData());
setTextViews(Build.VERSION.SDK_INT, data.getData()
.getPath(), realPath);
} catch (Exception e1) {
e1.printStackTrace();
Uri selectedImage = data.getData();
String[] filePathColumn = { MediaStore.Images.Media.DATA };
Cursor cursor = getContentResolver()
.query(selectedImage, filePathColumn, null,
null, null);
cursor.moveToFirst();
int columnIndex = cursor
.getColumnIndex(filePathColumn[0]);
String filePath = cursor.getString(columnIndex);
cursor.close();
newbitmap = BitmapFactory.decodeFile(filePath);
imageview.setImageBitmap(newbitmap);
}
}
else {
try {
realPath = RealPathUtil.getRealPathFromURI_API19(
yourclassname.this,
data.getData());
setTextViews(Build.VERSION.SDK_INT, data.getData()
.getPath(), realPath);
} catch (Exception e) {
Uri selectedImage = data.getData();
String[] filePathColumn = { MediaStore.Images.Media.DATA };
Cursor cursor = getContentResolver()
.query(selectedImage, filePathColumn, null,
null, null);
cursor.moveToFirst();
int columnIndex = cursor
.getColumnIndex(filePathColumn[0]);
String filePath = cursor.getString(columnIndex);
cursor.close();
newbitmap = BitmapFactory.decodeFile(filePath);
imageview.setImageBitmap(newbitmap);
}
}
// end
} else if (resultCode == RESULT_CANCELED) {
Toast.makeText(getApplicationContext(), "Canceled",
Toast.LENGTH_SHORT).show();
} else {
// failed to capture image
Toast.makeText(getApplicationContext(),
"Oops!! Failed to pick Image", Toast.LENGTH_SHORT).show();
}
}
Include this method in your class
private void setTextViews(int sdk, String uriPath, String realPath) {
Uri uriFromPath = Uri.fromFile(new File(realPath));
fileUri = uriFromPath;
try {
newbitmap = BitmapFactory.decodeStream(getContentResolver()
.openInputStream(fileUri));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
imageview.setImageBitmap(newbitmap);
Log.d("Status", "Build.VERSION.SDK_INT:" + sdk);
Log.d("Status", "URI Path:" + fileUri);
Log.d("Status", "Real Path: " + realPath);
}
Create this Helper Methods in RealPathUtil.class
public class RealPathUtil {
#SuppressLint("NewApi")
public static String getRealPathFromURI_API19(Context context, Uri uri){
String filePath = "";
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;
}
#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);
}
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
= cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
}
}
Hope this will solve your Problem.
I am creating an app which uploads a selected image from the gallery and uploads it to a web service. The webservice requires the filename of selected image plus a base64 encoding of the file contents. I have managed to achieve this with a hardcoded file path. However, I am struggling to get the real filepath of the image. I have read around the web and have this code, but it does not work for me:
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
Uri selectedImageUri = data.getData();
String[] projection = {MediaStore.Images.Media.DATA};
try {
Cursor cursor = getContentResolver().query(selectedImageUri, projection, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(projection[0]);
String picturePath = cursor.getString(columnIndex);
cursor.close();
Log.d("Picture Path", picturePath);
}
catch(Exception e) {
Log.e("Path Error", e.toString());
}
}
}
I get this error:
java.lang.NullPointerException
EDIT
Forgot to mention I am using Kitkat. It looks like my problem is KitKat related. I found this (see below) which helped me get my app working:
Android Gallery on KitKat returns different Uri for Intent.ACTION_GET_CONTENT
A little late to the party but here's my code, hope this helps.
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
Uri selectedImageUri = data.getData( );
String picturePath = getPath( getActivity( ).getApplicationContext( ), selectedImageUri );
Log.d("Picture Path", picturePath);
}
}
public static String getPath( Context context, Uri uri ) {
String result = null;
String[] proj = { MediaStore.Images.Media.DATA };
Cursor cursor = context.getContentResolver( ).query( uri, proj, null, null, null );
if(cursor != null){
if ( cursor.moveToFirst( ) ) {
int column_index = cursor.getColumnIndexOrThrow( proj[0] );
result = cursor.getString( column_index );
}
cursor.close( );
}
if(result == null) {
result = "Not found";
}
return result;
}
Use below code,
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
Uri selectedImageUri = data.getData();
String s = getRealPathFromURI(selectedImageUri);
editText1.setText(s);
}
}
and below is your getRealPathFromURI function,
public String getRealPathFromURI(Uri uri) {
String[] projection = { MediaStore.Images.Media.DATA };
#SuppressWarnings("deprecation")
Cursor cursor = managedQuery(uri, projection, null, null, null);
int column_index = cursor
.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
}
Try this:
Uri selectedImageURI = data.getData();
imageFile = new File(getRealPathFromURI(selectedImageURI));
And
private String getRealPathFromURI(Uri contentURI) {
Cursor cursor = getContentResolver().query(contentURI, null, null, null, null);
if (cursor == null) { // Source is Dropbox or other similar local file path
return contentURI.getPath();
} else {
cursor.moveToFirst();
int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
return cursor.getString(idx);
}
}
public class RealFilePath {
/**
* Get a file path from a Uri. This will get the 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
*/
public static 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];
}
// TODO handle non-primary volumes
}
// 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;
}
/**
* 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);
}
}
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());
}
}
If you are like me and you dont have a local file ready, for instance you want to give user a chance to take a picture and then upload the picture this is how to do it.
I am a noob in java but i have allot of experience in coding.
Stackoverflow helped me allot so now it is my time to do something back.
Under class activity you have to declare these two items.
asuming you have a working upload class and php script.
NOTE i am not taking any consideration about all the different API's
out there. I am using java compiler 1.7 and a API range of 10 to 18.
public class Yourproject extends Activity {
File imageFile;
File imageFileName;
//This part is needed for decoding the path adres.
private String getRealPathFromURI(Uri contentURI) {
String result;
Cursor cursor = getContentResolver().query(contentURI, null, null, null, null);
if (cursor == null) { // Source is Dropbox or other similar local file path
result = contentURI.getPath();
} else {
cursor.moveToFirst();
int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME);
result = cursor.getString(idx);
cursor.close();
}
return result;
}
//This is needed for the path name, now you might just want to use one decoding script depending on //your class in total.
//In my case this was the way to go.
//To use one single addres use this line ImageColumns.DATA in the int idx declaration.
private String getRealPathFromNAME(Uri contentNAME) {
String result;
Cursor cursor = getContentResolver().query(contentNAME, null, null, null, null);
if (cursor == null) { // Source is Dropbox or other similar local file path
result = contentNAME.getPath();
} else {
cursor.moveToFirst();
int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DISPLAY_NAME);
result = cursor.getString(idx);
cursor.close();
}
return result;
}
//Then under protected void onCreate(Bundle savedInstanceState) you place this code to get
//the image and process it.
#Override
protected void onCreate(Bundle savedInstanceState) {
//declare the ImageView
final ImageView inputPicture = (ImageView) findViewById(R.id.imageView2);
inputPicture.setImageURI((Uri) getIntent().getExtras().get("picture"));
//here where recieve the image from last page "Putextra" method
try {
//here we will get the data and proces it trough to get the real
//address for uploading.
//This is send from a other activity with a Intent.EXTRA_STREAM
//The code looks like this:
/*********"Putextra"*********/
//final ImageView iv = (ImageView) findViewById(R.id.imageView1);
//final Uri thumb = (Uri) getIntent().getExtras().get(Intent.EXTRA_STREAM);
//iv.setImageURI(thumb);
//Sending it to the next activity
//it.putExtra("picture", thumb);
/*********"Putextra"*********/
Uri fileUri = (Uri) getIntent().getExtras().get("picture");
//get
//Uri fileName = (Uri) getIntent().getExtras().get("picture");
//get
imageFile = new File(getRealPathFromURI(fileUri));
//send
imageFileName = new File(getRealPathFromNAME(fileUri));
//send
//i got a exeption Uri fileName, use fileUri twice..
} catch (Exception e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
//here we will declare the name for furter processing.
final File uploadFilePath = imageFile;
final File uploadFileName = imageFileName;
}
And the rest i will leave up to u, if you got this far, I am pretty sure you will finish.
Try this,
file = new File(getPath(outputFileUri));
public String getPath(Uri uri) {
String[] projection = { MediaStore.Images.Media.DATA };
#SuppressWarnings("deprecation")
Cursor cursor = managedQuery(uri, projection, null, null, null);
int column_index = cursor
.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
}
Hope this helps you
if (Build.VERSION.SDK_INT <19){
Intent intent = new Intent();
intent.setType("image/jpeg");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent,
getResources().getString(R.string.select_picture)),GALLERY_INTENT_CALLED);
}else{
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("image/jpeg");
startActivityForResult(intent, GALLERY_KITKAT_INTENT_CALLED);
}
#Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
if (resultCode != Activity.RESULT_OK) return;
if (null == data) return;
Uri originalUri = null;
if (requestCode == GALLERY_INTENT_CALLED) {
originalUri = data.getData();
}
else if (requestCode == GALLERY_KITKAT_INTENT_CALLED) {
originalUri = data.getData();
final int takeFlags = data.getFlags()
& (Intent.FLAG_GRANT_READ_URI_PERMISSION
| Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
// Check for the freshest data.
getContentResolver().takePersistableUriPermission(originalUri, takeFlags);
}
loadSomeStreamAsynkTask(originalUri);
}
Try this to get data as well as file path and insert into folder.
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
try {
if (resultCode == RESULT_OK)
{
nav = data.getData();
String[] projection = { MediaStore.Images.Media.DATA };
Cursor cursor = managedQuery(nav, projection, null, null, null);
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
String path= cursor.getString(column_index);
Toast.makeText(getApplicationContext(), path, 500).show();
mBitmap = android.provider.MediaStore.Images.Media.getBitmap(getContentResolver(), nav);
insert(mBitmap);
if (mBitmap != null) {
mBitmap.recycle();
mBitmap = null;
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
private void insert(Bitmap finalBitmap) {
File myDir=new File("/sdcard/saved_images");
myDir.mkdirs();
Random generator = new Random();
int n = 10000;
n = generator.nextInt(n);
String fname = "Image-"+ n +".jpg";
File file = new File (myDir, fname);
if (file.exists ()) file.delete ();
try {
FileOutputStream out = new FileOutputStream(file);
finalBitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
out.flush();
out.close();
File dstFile = new File(file.getParent(), "." + file.getName());
file.renameTo(dstFile);
} catch (Exception e) {
e.printStackTrace();
}
}