Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how get Result from onActivityResult in Fragment?

I have used Navigation drawer in each item click i have called Fragments so in one item i have called one Fragment in this fragment i need to get picture from camera and set it to as canvas background. In this I have captured camera picture but don't know how to get this picture after captured and set it to on canvas background.

Fragment code

import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.v4.app.Fragment;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.Toast;

import com.ssoft.admin.code.SharedPreferenceStore;
import com.ssoft.admin.code.Tools;
import com.ssoft.admin.salesmateco.FragSiteInspectionAdditional;
import com.ssoft.admin.salesmateco.R;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class FragSignature extends Fragment implements View.OnClickListener {
    Button mSIBtnCamera;
    Fragment fragment;
    Tools mTools;
    private static final int RESULT_OK = 1;
    private static final int RESULT_CANCELED = 0;
    Uri imageUri = null;
    final int CAMERA_DATA = 100, INTENT_DATA = 1;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(
                R.layout.frag_site_inspection_signature, null);
        mSIBtnCamera = (Button) rootView.findViewById(R.id.camera);
        mSIBtnCamera.setOnClickListener(this);

        return rootView;
    }

    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.camera) {
            captureImage();
        }

        else {
            Toast.makeText(getActivity().getApplicationContext(),
                    "FragSIPhotos Add Button OnClick", Toast.LENGTH_SHORT)
                    .show();

        }
    }

    public void captureImage() {
        // Define the file-name to save photo taken by Camera activity

        String fileName = "Images.jpg";

        // Create parameters for Intent with filename

        ContentValues values = new ContentValues();

        values.put(MediaStore.Images.Media.TITLE, fileName);

        values.put(MediaStore.Images.Media.DESCRIPTION,
                "Image capture by camera");

        // imageUri is the current activity attribute, define and save it for
        // later usage

        Uri imageUri = getActivity().getApplicationContext()
                .getContentResolver()
                .insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);

        /****
         * EXTERNAL_CONTENT_URI : style URI for the "primary" external storage
         * volume.
         ****/

        // Standard Intent action that can be sent to have the camera
        // application capture an image and return it.

        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

        intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);

        intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, INTENT_DATA);
        Log.e("captureImage()", "state -1");
        getActivity().startActivityForResult(intent, CAMERA_DATA);
        Log.e("captureImage()", "end");

    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        Log.e("OnActivityResult()", "1");

        if (requestCode == CAMERA_DATA) {
            Log.e("OnActivityResult()", "2");

            if (resultCode == RESULT_OK) {
                // Image captured and saved to fileUri specified in the Intent
                Log.e("OnActivityResult()", "3");
            } else if (resultCode == RESULT_CANCELED) {
                // User cancelled the image capture
                Log.e("OnActivityResult()", "4");
            } else {
                // Image capture failed, advise user
                Log.e("OnActivityResult()", "5");
            }
        }
        Log.e("OnActivityResult()", "6");
        super.onActivityResult(requestCode, resultCode, data);
        Log.e("OnActivityResult()", "7");
    }

}
like image 282
Hiren Vaghela Avatar asked Feb 11 '15 08:02

Hiren Vaghela


2 Answers

Replace

getActivity().startActivityForResult(intent, CAMERA_DATA);

with

startActivityForResult(intent, CAMERA_DATA);
like image 39
Ramesh Avatar answered Oct 20 '22 00:10

Ramesh


In Activity class:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{

    super.onActivityResult(requestCode,resultCode,data);

}

In Fragment :

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data){}

Option 1 :

If you're calling startActivityForResult() from the fragment then you should call startActivityForResult() not getActivity().startActivityForResult(), as it will result in fragment onActivityResult().

If you're not sure where you're calling on startActivityForResult() and how you will be calling methods.

Option 2:

Since Activity gets the result of onActivityResult(), you will need to override the activity's onActivityResult() and call super.onActivityResult()to propagate to the respective fragment for unhandled results codes or for all.

If above 2 options do not work, then refer option 3 as it will definitely work.

Option 3 :

Explicit call from fragment to onActivityResult function as follows

In Parent Activity class, override the onActivityResult() method and even override the same in Fragment Class and call as the following code.

In Activity:

@Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
Fragment fragment = getSupportFragmentManager().findFragmentById("yourFragment"); 
fragment.onActivityResult(requestCode, resultCode, data); 
}

In Fragment:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
   //in fragment class callback
}
like image 101
Arslan Sohail Avatar answered Oct 20 '22 00:10

Arslan Sohail