1

I am building a simple camera app that opens up the the system camera app on a button click and displays it in a image view.But the app is crashing on the startActivityForResult method.

MainActivity.java:

import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

public class MainActivity extends AppCompatActivity {


static final int REQUEST_IMAGE_CAPTURE = 1;
ImageView imageView;
Button button;

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if(requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK){
        Bundle extra = data.getExtras();
        Bitmap bitmap = (Bitmap) extra.get("data");
        imageView.setImageBitmap(bitmap) ;
    }
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    imageView = (ImageView) findViewById(R.id.imageView);
    button = (Button) findViewById(R.id.button);
    if(getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY))
        button.setEnabled(true);

    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(intent,REQUEST_IMAGE_CAPTURE);
        }
    });


}
}

log cat:

                                                                                Process: com.eldhoittangeorge.camera11032017, PID: 587
                                                                              java.lang.SecurityException: Permission Denial: starting Intent { act=android.media.action.IMAGE_CAPTURE cmp=org.cyanogenmod.snap/com.android.camera.PhotoCamera } from ProcessRecord{f228cdc 587:com.eldhoittangeorge.camera11032017/u0a132} (pid=587, uid=10132) with revoked permission android.permission.CAMERA
                                                                                 at android.os.Parcel.readException(Parcel.java:1684)
                                                                                 at android.os.Parcel.readException(Parcel.java:1637)
                                                                                 at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:3093)
                                                                                 at android.app.Instrumentation.execStartActivity(Instrumentation.java:1520)
                                                                                 at android.app.Activity.startActivityForResult(Activity.java:4225)
                                                                                 at android.support.v4.app.BaseFragmentActivityJB.startActivityForResult(BaseFragmentActivityJB.java:50)
                                                                                 at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:79)
                                                                                 at android.app.Activity.startActivityForResult(Activity.java:4183)
                                                                                 at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:859)
                                                                                 at com.eldhoittangeorge.camera11032017.MainActivity$1.onClick(MainActivity.java:42)
                                                                                 at android.view.View.performClick(View.java:5639)
                                                                                 at android.view.View$PerformClick.run(View.java:22391)
                                                                                 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:6088)
                                                                                 at java.lang.reflect.Method.invoke(Native Method)
                                                                                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
                                                                                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
el2e10
  • 1,518
  • 22
  • 22
  • 1
    The [logcat will tell you what reason your app has stopped](http://stackoverflow.com/questions/23353173/unfortunately-myapp-has-stopped-how-can-i-solve-this). Please [edit] your question with it. – OneCricketeer Mar 11 '17 at 05:07
  • this is happening on marshmallow?? – Moulesh Mar 11 '17 at 05:15
  • @Moulesh yes this happening in marshmallow – el2e10 Mar 11 '17 at 05:17
  • Possible duplicate of [android : camera doesn't open in marshmallow](http://stackoverflow.com/questions/33051265/android-camera-doesnt-open-in-marshmallow) – Chintan Soni Mar 11 '17 at 05:31

2 Answers2

3

call active take photo on button click

private void activeTakePhoto() {

        if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED ) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 110);
        } else {
            takePicture();
        }

    }

    public void takePicture() {
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(intent, 22);
    }

and override

@Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        if (requestCode == 110) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED
                    && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
                takePicture();
            }
        }}

and manifest should have

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

why you are supposed to follow this procedure is because from marshmallow onward its mandatory to ask for self permission from the user before using camera and accessing galley irrespective of you have permission in your manifest.

Moulesh
  • 2,762
  • 1
  • 22
  • 32
1
import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.provider.MediaStore;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

public class MainActivity extends AppCompatActivity {


static final int REQUEST_IMAGE_CAPTURE = 1;
ImageView imageView;
Button button;

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if(requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK){
        Bundle extra = data.getExtras();
        Bitmap bitmap = (Bitmap) extra.get("data");
        imageView.setImageBitmap(bitmap) ;
    }
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    imageView = (ImageView) findViewById(R.id.imageView);
    button = (Button) findViewById(R.id.button);


    if(ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)!= PackageManager.PERMISSION_GRANTED){
        ActivityCompat.requestPermissions(this,new String[] {Manifest.permission.CAMERA},110);
        takingPhoto();
    }
    else {
        takingPhoto();
    }
}
public void takingPhoto(){
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(intent,REQUEST_IMAGE_CAPTURE);
        }
    });
}

}

el2e10
  • 1,518
  • 22
  • 22