2

I have 2 buttons on Images(fragment). One for capture image using camera and second for select from gallery. I can capture image and select image but it is not opening new activity. It is opening same activity again. And also capture image not saving in my new Directory.It create directory but not saving image in it. it is saving in default camera folder.

Images fragment code- that have 2 buttons

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
  //  return inflater.inflate(R.layout.fragment_images, container, false);
    View v = inflater.inflate(R.layout.fragment_images, container, false);
    FloatingActionButton btnCamera = (FloatingActionButton) v.findViewById(R.id.btnCamera);
    FloatingActionButton btnFolder = (FloatingActionButton) v.findViewById(R.id.btnFolder);

    btnCamera.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            File imageFolder = new File(Environment.getExternalStorageDirectory(), "/My Children");
            imageFolder.mkdir();
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-mm-dd");
            String timestamp = simpleDateFormat.format(new Date());
            File image = new File(imageFolder, timestamp+ ".jpg");
            Uri uriImage = Uri.fromFile(image);
            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            intent.putExtra(MediaStore.EXTRA_OUTPUT, uriImage);
            startActivityForResult(intent, TAKE_PICTURE);
            }
    });
    btnFolder.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent = new Intent();
            intent.setType("image/*");
            intent.setAction(Intent.ACTION_GET_CONTENT);
            startActivityForResult(intent, SELECT_PICTURE);
        }
    });
    return v;

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
  //  return inflater.inflate(R.layout.fragment_images, container, false);
    View v = inflater.inflate(R.layout.fragment_images, container, false);
    FloatingActionButton btnCamera = (FloatingActionButton) v.findViewById(R.id.btnCamera);
    FloatingActionButton btnFolder = (FloatingActionButton) v.findViewById(R.id.btnFolder);

    btnCamera.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            File imageFolder = new File(Environment.getExternalStorageDirectory(), "/My Children");
            imageFolder.mkdir();
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-mm-dd");
            String timestamp = simpleDateFormat.format(new Date());
            File image = new File(imageFolder, timestamp+ ".jpg");
            Uri uriImage = Uri.fromFile(image);
            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            intent.putExtra(MediaStore.EXTRA_OUTPUT, uriImage);
            startActivityForResult(intent, TAKE_PICTURE);
            }
    });
    btnFolder.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent = new Intent();
            intent.setType("image/*");
            intent.setAction(Intent.ACTION_GET_CONTENT);
            startActivityForResult(intent, SELECT_PICTURE);
        }
    });
    return v;

Upload Activity- where i want to show image

ImageView imageview = (ImageView) findViewById(R.id.imageview);
    Intent intent = getIntent();
    Bitmap bitmap = (Bitmap) intent.getParcelableExtra("image");
    imageview.setImageBitmap(bitmap);

Logcat

 E/AndroidRuntime: FATAL EXCEPTION: main
              Process: com.smiles.mychildren, PID: 5019
              android.os.FileUriExposedException: file:///storage/emulated/0/My%20Children/2018-19-09.jpg exposed beyond app through ClipData.Item.getUri()
                  at android.os.StrictMode.onFileUriExposed(StrictMode.java:1799)
                  at android.net.Uri.checkFileUriExposed(Uri.java:2346)
                  at android.content.ClipData.prepareToLeaveProcess(ClipData.java:832)
                  at android.content.Intent.prepareToLeaveProcess(Intent.java:8909)
                  at android.content.Intent.prepareToLeaveProcess(Intent.java:8894)
                  at android.app.Instrumentation.execStartActivity(Instrumentation.java:1517)
                  at android.app.Activity.startActivityForResult(Activity.java:4224)
                  at android.support.v4.app.BaseFragmentActivityApi16.startActivityForResult(BaseFragmentActivityApi16.java:54)
                  at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:67)
                  at android.support.v4.app.ActivityCompat.startActivityForResult(ActivityCompat.java:152)
                  at android.support.v4.app.FragmentActivity.startActivityFromFragment(FragmentActivity.java:798)
                  at android.support.v4.app.FragmentActivity$HostCallbacks.onStartActivityFromFragment(FragmentActivity.java:907)
                  at android.support.v4.app.Fragment.startActivityForResult(Fragment.java:1028)
                  at android.support.v4.app.Fragment.startActivityForResult(Fragment.java:1017)
                  at com.smiles.mychildren.Images$1.onClick(Images.java:98)
                  at android.view.View.performClick(View.java:5609)
                  at android.view.View$PerformClick.run(View.java:22259)
                  at android.os.Handler.handleCallback(Handler.java:751)
                  at android.os.Handler.dispatchMessage(Handler.java:95)
                  at android.os.Looper.loop(Looper.java:154)
                  at android.app.ActivityThread.main(ActivityThread.java:6077)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

2 Answers2

0

You have done wrong here, you add parameter after startActivityForResult called.

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, TAKE_PICTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uriImage);

Just change this

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uriImage);
startActivityForResult(intent, TAKE_PICTURE);

also you set same request code for both image capture and select image from gallery, you have to set different request code.

You are mapping RESULT_OK with resultCode that is wrong. just change this.

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == TAKE_PICTURE &&  resultCode== RESULT_OK){
            Bitmap bitmap = (Bitmap) data.getExtras().get("data");
            Intent i = new Intent(getActivity(), Upload.class);
            i.putExtra("image", bitmap);
            startActivity(i);
    }

  //TAKE_PICTURE(int 1) request code for camera capture
 //PICK_PICTURE_FROM_GALLERY (int 2) code for select image from gallery.

   if (requestCode == PICK_PICTURE_FROM_GALLERY &&  resultCode== RESULT_OK){
            Bitmap bitmap = (Bitmap) data.getExtras().get("data");
            Intent i = new Intent(getActivity(), Upload.class);
            i.putExtra("image", bitmap);
            startActivity(i);
    }
  }
Hemant Parmar
  • 3,924
  • 7
  • 25
  • 49
  • app crashed on startActivityForResult after this change. –  Jan 09 '18 at 06:38
  • i update the code, create new int PICK_PICTURE_FROM_GALLERY for select image gallery. pass this to startActivityForResult(intent, PICK_PICTURE_FROM_GALLERY ); for select image gallery. – Hemant Parmar Jan 09 '18 at 07:01
  • check i updated code.. but crashing on opening camera. and opening same activity when selecting from gallery. –  Jan 09 '18 at 07:21
  • i added in question –  Jan 09 '18 at 07:39
  • its not related to i post, have look [this](https://stackoverflow.com/a/44821425/5110595) for your error. – Hemant Parmar Jan 09 '18 at 07:45
0

First add permission on manifest.xml -

 <uses-feature
        android:name="android.hardware.camera"
        android:required="true" />

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

For capturing image with camera -

//capture image from camera
    private void dispatchTakePictureIntent() {
        Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
            startActivityForResult(takePictureIntent, ConstantCollection.REQUEST_IMAGE_CAPTURE);
        }
    }

And use Intent.ACTION_PICK as Intent For picking image from gallery -

/pic image from   gallery
    private void pickImageFromGallery(){
        Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
        photoPickerIntent.setType("image/*");
        startActivityForResult(photoPickerIntent, ConstantCollection.REQUEST_IMAGE_GALLERY);
    }

And on OnActivityResult() -

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

        //for camera capture
        if (requestCode == ConstantCollection.REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK && data != null) {
            Bundle extras = data.getExtras();
            Bitmap imageBitmap = (Bitmap) extras.get("data");
            Intent i = new Intent(getActivity(), Upload.class);
            i.putExtra("image", imageBitmap );
            startActivity(i);
        }

        //for gallery
        if (requestCode == ConstantCollection.REQUEST_IMAGE_GALLERY && resultCode == RESULT_OK && data != null) {
            // Let's read picked image data - its URI
            Uri pickedImage = data.getData();
            // Let's read picked image path using content resolver
            String[] filePath = { MediaStore.Images.Media.DATA };
            Cursor cursor = getContentResolver().query(pickedImage, filePath, null, null, null);
            cursor.moveToFirst();
            String imagePath = cursor.getString(cursor.getColumnIndex(filePath[0]));

            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inPreferredConfig = Bitmap.Config.ARGB_8888;
            Bitmap bitmap = BitmapFactory.decodeFile(imagePath, options);
            cursor.close();

            Intent i = new Intent(getActivity(), Upload.class);
            i.putExtra("image", bitmap);
            startActivity(i);
        }
    }
AGM Tazim
  • 2,213
  • 3
  • 16
  • 25
  • You need to use `FileProviderApi` for `FileUriExposedException` . Follow these for `FileUriExposedException` - - https://stackoverflow.com/questions/38200282/android-os-fileuriexposedexception-file-storage-emulated-0-test-txt-exposed - https://medium.com/@ali.muzaffar/what-is-android-os-fileuriexposedexception-and-what-you-can-do-about-it-70b9eb17c6d0 . It should work. I have posted these code from my developed application. – AGM Tazim Jan 09 '18 at 07:33