handling result from activity to a fragment - android

I have a fragment which contains four images each image when clicked it opens a gallery for the user to select image from there in the activity result when retrieving the image name and path I'm passing this result to an activity through intent that handles the cropping of the image in the cropping activity after the cropping is done i don't know how to send back the result of the cropped image to the fragment and place it in the image view same process is done for the 4 images how can i achieve that. Here is my starting code.
enter code here
attach_button.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
pickFromGallery();
}
});
private void pickFromGallery()
{
Intent galleryIntent = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(galleryIntent, RESULT_LOAD_IMG);
}
#Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
try {
// When an Image is picked
if (requestCode == RESULT_LOAD_IMG && resultCode == getActivity().RESULT_OK
&& null != data) {
// Get the Image from data
Uri selectedImage = data.getData();
String[] filePathColumn = {MediaStore.Images.Media.DATA};
// Get the cursor
Cursor cursor = getContext().getContentResolver().query(selectedImage,
filePathColumn, null, null, null);
// Move to first row
assert cursor != null;
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
imgDecodableString = cursor.getString(columnIndex);
cursor.close();
startCrop(imgDecodableString);
} else {
Toast.makeText(getActivity(), "You haven't picked Image",
Toast.LENGTH_LONG).show();
}
} catch (Exception e) {
Toast.makeText(getActivity(), "Something went wrong", Toast.LENGTH_LONG)
.show();
}
}
private void startCrop(String imageUri)
{
Intent intent = new Intent(getActivity(),CropActivity.class);
intent.putExtra("Image",imageUri);
startActivity(intent);
}
}
in my cropping activity here is my code
enter code here
Intent i = getIntent();
image = i.getStringExtra("Image");
Log.d("Image",""+image);
DisplayMetrics metrics = getResources().getDisplayMetrics();
int imageWidth = (int) ( (float) metrics.widthPixels / 1.5 );
int imageHeight = (int) ( (float) metrics.heightPixels / 1.5 );
bitmap = BitmapLoadUtils.decode(image, imageWidth, imageHeight);
imageCropView.setImageBitmap(bitmap);
imageCropView.setAspectRatio(3, 2);
findViewById(R.id.crop_btn).setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v)
{
if(!imageCropView.isChangingScale())
{
Bitmap b = imageCropView.getCroppedImage();
}
}
});
after cropping here the image i need to set this cropped image in the image view in the fragment same for the rest of the image with the same process how can this be achieved .
Any help would be appreciated.

You can start the activity using startActivityForResult(...) method, so you can send data back.
As for how to pass the bitmap using intent, check this stackoverflow question.
Then you can get the Bitmap on the onActivityResult(...) method of your fragment.

Passing bitmaps via intents is not a good practice and will not work if the bitmap is large and therefore should be avoided.
I would suggest u to save the bitmap on disk and pass the path of the saved image to the fragment. Check the edit of the accepted answer in this post
Also shouldn't call startActivity() from a fragment. It should be done from the another activity. Check this Communicating With Fragments Guide

Related

How to open gallery first instead of opening activity view?

So I'm trying to find a way how to write the code that when I open the app it automatically first of all open the gallery and then when you choose the picture it appears on Main Activity. How to do that? Am I need another activity? Because now first of all it opens Main Activity view and only then you can click the button and choose what you wanna do.
Code for loading and showing picture:
ocamera.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View arg0) {
Intent i = new Intent(
Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(i, RESULT_LOAD_IMAGE);
}
});
if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
== PackageManager.PERMISSION_GRANTED) {
} else if (shouldShowRequestPermissionRationale(
Manifest.permission.READ_EXTERNAL_STORAGE)) {
Toast.makeText(this, "Permission is important to be able edit photos.",
Toast.LENGTH_SHORT).show();
}
requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE);
// MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE is an
// app-defined int constant
return;
}
#Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) {
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 picturePath = cursor.getString(columnIndex);
cursor.close();
ImageView im = (ImageView) findViewById(R.id.myimage);
im.setImageBitmap(BitmapFactory.decodeFile(picturePath));
BitmapDrawable abmp = (BitmapDrawable) im.getDrawable();
bmp = abmp.getBitmap();
if (picturePath != null && bmp != null) {
int height = bmp.getHeight(), width = bmp.getWidth();
if (height > 1280 && width > 960) {
Bitmap bmp = BitmapFactory.decodeFile(picturePath);
im.setImageBitmap(bmp);
im.setVisibility(View.VISIBLE);
} else {
im.setImageBitmap(bmp);
im.setVisibility(View.VISIBLE);
}
}
}
}
If you want your gallery code to run as the first thing, you can simply call the method inside onCreate of your activity
#Override
public void onCreate(Bundle saveInstanceState){
super.onCreate(saveInstanceState);
//you can check permissions here
//call the method here with code you use to open gallery
pickImageFromGallery();
}
private pickImageFromGallery(){
//your code to open gallery here
Intent i = new Intent(
Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(i, RESULT_LOAD_IMAGE);
}
This will ensure your gallery is opened every time. You can optionally call the method inside onResume() because then you will be guaranteed that the code will run.
Good luck and I hope you find it helpful.

When I change screen orientation using sensor ImageView becomes blank in android?

Here i am using following code
Here the problem is to using following code i am picked image from gallery and set in ImageView but when i rotate screen the ImageView become blank. So give me the solution for how to save state and displaying the image.
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View view) {
// Create intent to Open Image applications like Gallery, Google Photos
Intent galleryIntent = new Intent(Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
// Start the Intent
startActivityForResult(galleryIntent, RESULT_LOAD_IMG);
//Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
//.setAction("Action", null).show();
//Intent i = new Intent(MainActivity.this,firstActivity.class);
//startActivity(i);
}
});
}
#Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
super.onActivityResult(requestCode, resultCode, data);
try {
// When an Image is picked
if (requestCode == RESULT_LOAD_IMG && resultCode == RESULT_OK
&& null != data) {
// Get the Image from data
Uri selectedImage = data.getData();
String[] filePathColumn = { MediaStore.Images.Media.DATA };
// Get the cursor
Cursor cursor = getContentResolver().query(selectedImage,
filePathColumn, null, null, null);
// Move to first row
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
imgDecodableString = cursor.getString(columnIndex);
cursor.close();
ImageView imgView = (ImageView) findViewById(R.id.imgView);
// Set the Image in ImageView after decoding the String
imgView.setImageBitmap(BitmapFactory
.decodeFile(imgDecodableString));
} else {
Toast.makeText(this, "You haven't picked Image",
Toast.LENGTH_LONG).show();
}
} catch (Exception e) {
Toast.makeText(this, "Something went wrong", Toast.LENGTH_LONG)
.show();
}
}
Time rotation restart the activity. This restart must be prevented.
Add the following code in the manifest file in the desired activity
android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
use this in manifest activity tag.
android:screenOrientation="nosensor"
When you change orientation, if you doesn't add
android:configChanges="keyboardHidden|orientation|screenSize"
in manifest -> activity will re-create. Please re-check it.

Save a ImageView state after exit App (onSaveInstanceState)

I have a app where i allow the user to pick a picture from galery and it use as PROFILE PICTURE, pick a picture and set in a "ImageView" in my app.
The problem is that when the app is closed, ou the activity is changed the picture desapear, or back de default picture again, i want save this picture state for when back to activity or when close and re-open the app the picture continue there and dont need set all over again.
I am new in developing, please if you can help me looking my code below and give make the needed changes and give me the ready code i will be really deeply thankful cause i spent several days for do it and still i cant. I need a ready code cause i am new in developing and if you try explain something i will not understand.
Here is my code where i pick the picture:
public class MainActivity extends Activity {
private static int RESULT_LOAD_IMG = 1;
String imgDecodableString;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void loadImagefromGallery(View view) {
// Create intent to Open Image applications like Gallery, Google Photos
Intent galleryIntent = new Intent(Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
// Start the Intent
startActivityForResult(galleryIntent, RESULT_LOAD_IMG);
}
#Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
try {
// When an Image is picked
if (requestCode == RESULT_LOAD_IMG && resultCode == RESULT_OK
&& null != data) {
// Get the Image from data
Uri selectedImage = data.getData();
String[] filePathColumn = { MediaStore.Images.Media.DATA };
// Get the cursor
Cursor cursor = getContentResolver().query(selectedImage,
filePathColumn, null, null, null);
// Move to first row
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
imgDecodableString = cursor.getString(columnIndex);
cursor.close();
ImageView imgView = (ImageView) findViewById(R.id.imgView);
// Set the Image in ImageView after decoding the String
imgView.setImageBitmap(BitmapFactory
.decodeFile(imgDecodableString));
} else {
Toast.makeText(this, "You haven't picked Image",
Toast.LENGTH_LONG).show();
}
} catch (Exception e) {
Toast.makeText(this, "Something went wrong", Toast.LENGTH_LONG)
.show();
}
}
}
Try overriding the onSaveInstanceState Activity lifecycle methods. Here's a blog post regarding its best practices.
http://inthecheesefactory.com/blog/fragment-state-saving-best-practices/en

Create a class specifically for retrieving an image?

I have a method of retrieving an image from the gallery that works perfectly fine for me. My issue is, I use it in three separate activities and feel that I should make a class that can be called to get the image.
This is my code:
private void getImage () {
Intent galleryIntent = new Intent(Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
// Start the Intent
startActivityForResult(galleryIntent, RESULT_LOAD_IMG);
}
and
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
mRLMenuParams.setVisibility(View.GONE);
mRLImageParams.setVisibility(View.VISIBLE);
bmSelectedImage = null;
try {
// When an Image is picked
if (requestCode == RESULT_LOAD_IMG && resultCode == RESULT_OK
&& null != data) {
// Get the Image from data
Uri selectedImage = data.getData();
String[] filePathColumn = { MediaStore.Images.Media.DATA };
// Get the cursor
Cursor cursor = getContentResolver().query(selectedImage,
filePathColumn, null, null, null);
// Move to first row
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
imgDecodableString = cursor.getString(columnIndex);
cursor.close();
ImageView imSelectedImage = (ImageView) findViewById(R.id.imageView_image);
imSelectedImage.setImageBitmap(BitmapFactory.decodeFile(imgDecodableString));
Bitmap bmImage = Bitmap.createBitmap(BitmapFactory.decodeFile(imgDecodableString));
bmSelectedImage = bmImage.copy(Bitmap.Config.ARGB_8888, true);
} else {
Toast.makeText(this, "You haven't picked Image", Toast.LENGTH_LONG).show();
}
} catch (Exception e) {
Toast.makeText(this, "Something went wrong", Toast.LENGTH_LONG).show();
}
}
When I try to put this in its own class, i can't get it to work, even when passing the Context. It seems that I would need to make it an activity, and if so, I don't see the point in separating it. Am I missing something that will allow me to put this in its own class and return the image?
Thanks!
You're using the method onActivityResult which comes from Activity. Maybe have a class method to do the code you have inside onActivityResult. Change your class to contain two separate methods, since if your separate class contains onActivity it won't work unless it's an activity.
http://developer.android.com/reference/android/app/Activity.html

Large image Extra in Intent, cause black Screen in Android

I have this code to pick the images from gallery or camera:
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case SELECT_PICTURE_ACTIVITY_REQUEST_CODE:
if (resultCode == RESULT_OK) {
Uri selectedImage = data.getData();
String[] filePathColumn = { MediaStore.Images.Media.DATA,
MediaStore.Images.Media.DISPLAY_NAME };
Cursor cursor = getContentResolver().query(selectedImage,
filePathColumn, null, null, null);
if (cursor.moveToFirst()) {
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String filePath = cursor.getString(columnIndex);
ext = filePath
.substring(filePath.lastIndexOf(".") + 1);
photod = BitmapFactory.decodeFile(filePath);
new AsyncTaskOne().execute(new String[] {});
(fileNameIndex);
}
}
break;
case SELECT_CAMERA_ACTIVITY_REQUEST_CODE:
if (requestCode == CAMERA_REQUEST) {
photod = (Bitmap) data.getExtras().get("data");
new AsyncTaskOne().execute(new String[] {});
}
}
}
When I press the confirm button I invoke this listener
OnClickListener confirm = new OnClickListener() {
public void onClick(View v) {
Intent i = new Intent("com.striget.eu.UpdatePhoto");
i.putExtra(PropertiesUpdatedPhoto.EXTRA_PHOTO, codedPhoto);
i.putExtra(PropertiesUpdatedPhoto.EXTRA_EXT, ext);
startActivity(i);
}
};
(where codedPhoto is the image coded in base64 by another method)
to send the image and its extension in another activity
Everything works fine with small images but if I chose a medium size image or large photo(also if isn't very large), the app freezes, the screen becomes black and If I wait some minutes return on the current activity without showing any error in the stack and the invoked intent PropertiesUpdatedPhoto doesn't start.
How I could fix this problem?
This problem is discuss here, we should keep intent extra content as small as possible.
My suggestion is instead of passing image, perhaps passing the image URI or Path would be a better solution. Then only load the image in that Activity.
Example :
OnClickListener confirm = new OnClickListener() {
public void onClick(View v) {
Intent i = new Intent("com.striget.eu.UpdatePhoto");
i.setData(PropertiesUpdatedPhoto.EXTRA_PHOTO, # Image URI Here # );
// Or i.putExtra(PropertiesUpdatePhoto.EXTRA_PHOTO, # Image Path Here #);
i.putExtra(PropertiesUpdatedPhoto.EXTRA_EXT, ext);
startActivity(i);
}
};

Categories

Resources