0

I recently made an app wherein when user clicks on the "Take Picture" button on the screen the app would capture an image with the default native app of the Android OS. When I ran the app on the AVD emulator in Android Studio the app would launch but when I clicked the button the app crashed with a pop-up dialog stating "Unfortunately, the app has stopped working."

I have consulted Android developer site documentation as well as various sites but still there is no improvement.

Please tell me why is this happening. Here is the code for the app:

Code for AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
 <manifest
    package="com.example.the_joker.simplephoto"
    xmlns:android="http://schemas.android.com/apk/res/android">

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>

</manifest>

Code for MainActivity.java

package com.example.the_joker.simplephoto;

import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.provider.MediaStore;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Button;
import android.widget.ImageView;

public class MainActivity extends AppCompatActivity {
    private static final int CAMERA_REQUEST=123;
    private ImageView imageView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar=(Toolbar)findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG).setAction("Action", null).show();
            }
        });

        imageView=(ImageView)findViewById(R.id.imageView1);
        Button photoButton=(Button)findViewById(R.id.button1);

        photoButton.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view){
                Intent cameraIntent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                startActivityForResult(cameraIntent, CAMERA_REQUEST);
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            if (requestCode == CAMERA_REQUEST && resultCode == RESULT_OK) {
            Bitmap photo=(Bitmap)data.getExtras().get("data");
            imageView.setImageBitmap(photo);
        }
    }
}

Code for content_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context="com.example.the_joker.simplephoto.MainActivity"
    tools:showIn="@layout/activity_main">

    <Button android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Take picture"/>

    <ImageView android:id="@+id/imageView1"
               android:layout_height="wrap_content"
               android:layout_width="wrap_content"
               android:layout_marginTop="200dp"
               android:layout_marginLeft="50dp"/>
</LinearLayout>

The logcat exception when I clicked on the button

08-01 20:27:37.862 3977-3977/com.example.the_joker.simplephoto 
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.the_joker.simplephoto, PID: 3977
java.lang.SecurityException: Permission Denial: starting Intent { 
act=android.media.action.IMAGE_CAPTURE cmp=com.android.camera/.Camera } 
from ProcessRecord{43c5315 3977:com.example.the_joker.simplephoto/u0a76} 
(pid=3977, uid=10076) with revoked permission android.permission.CAMERA
at android.os.Parcel.readException(Parcel.java:1599)
at android.os.Parcel.readException(Parcel.java:1552)
at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:2658)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1507)
at android.app.Activity.startActivityForResult(Activity.java:3917)
at android.support.v4.app.BaseFragmentActivityJB.startActivityForResult(BaseFragmentActivityJB.java:48)
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:75)
at android.app.Activity.startActivityForResult(Activity.java:3877)
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:871)
at com.example.the_joker.simplephoto.MainActivity$2.onClick(MainActivity.java:43)
at android.view.View.performClick(View.java:5198)
at android.view.View$PerformClick.run(View.java:21147)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Aayush Goyal
  • 391
  • 1
  • 8
  • 21
  • Can you share the exception that has occurred? From your logcat? – srijanshukla Jul 31 '16 at 17:59
  • Yes I have done that. Check the new code for logcat errros. – Aayush Goyal Aug 01 '16 at 15:22
  • http://stackoverflow.com/questions/32789027/android-m-camera-intent-permission-bug Check this^, similar to your problem. Or try my answer. – srijanshukla Aug 01 '16 at 16:20
  • 1
    Yes @srijanshukla you are right. I have researched on many sites and everywhere there was only one solution to the problem which is "Permission Change while dealing with Android M+" and that is what your link refers to. Problem solved! (y) – Aayush Goyal Oct 19 '16 at 07:13

2 Answers2

0

wrong symbol or not allowed in package name, but that is just a guess.

Fred Grott
  • 3,505
  • 1
  • 23
  • 18
  • If so then why the app is running. It's just crashing when the user clicks on the button to capture an image. Maybe there's a problem with using default camera app in API 21 and above but I don't know. I have seen the official documentation site and many other sites but everywhere the same code was written then how come the app is crashing on the click? – Aayush Goyal Aug 01 '16 at 13:01
0

Replace this,
<uses-permission android:name="android.permission.CAMERA"/>
with this,
<uses-feature android:name="android.hardware.camera" android:required="true" />

srijanshukla
  • 1,066
  • 2
  • 13
  • 21