Android アプリ開発での Intentを使ったカメラ連携でのエラー Permission?

投稿者: Anonymous

ほんきで学ぶAndroidアプリ開発入門という本でAndroid開発を学んでいます
今はIntentを使ったアプリの連携を学んでいるのですが、
カメラを使う連携でどうしてもエラーが出てしまいます。
オプションメニューで選ばれたときにカメラを呼び出し、写真を撮り
撮った写真を表示するというプログラムなのですが、
まずMainActivity.javaに次のようなコードを追加しました

private Uri mImgUri;

/**/

if(itemId == R.id.action_camera){
                String fileName = System.currentTimeMillis()+".jpg";
                ContentValues values = new ContentValues();
                values.put(MediaStore.Images.Media.TITLE,fileName);
                values.put(MediaStore.Images.Media.MIME_TYPE,"image/jpeg");
                Log.v("test",fileName);
                mImgUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,values);
                Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                intent.putExtra(MediaStore.EXTRA_OUTPUT,mImgUri);
                Log.v("test","test1");
                startActivityForResult(intent,100);
            }

  @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if(requestCode ==100){
            //ImageViewに表示する場合
            ImageView imageView =(ImageView)findViewById(R.id.imageview);
            imageView.setImageURI(mImgUri);
        }
    }

そしてAndroidManifest.xmlに次の→ ←の所のコードを追加しました

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.kayosystem.honki.chapter06.lesson25" >

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

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

このプログラムを実行したとき出るエラーは次の通りです

02-13 15:31:53.306 14237-14237/com.kayosystem.honki.chapter06.lesson25 E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.kayosystem.honki.chapter06.lesson25, PID: 14237
  java.lang.SecurityException: Permission Denial: writing com.android.providers.media.MediaProvider uri content://media/external/images/media from pid=14237, uid=10364 requires android.permission.WRITE_EXTERNAL_STORAGE, or grantUriPermission()
      at android.os.Parcel.readException(Parcel.java:1688)
      at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:183)
      at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135)
      at android.content.ContentProviderProxy.insert(ContentProviderNative.java:482)
      at android.content.ContentResolver.insert(ContentResolver.java:1277)
      at com.kayosystem.honki.chapter06.lesson25.MainActivity.onOptionsItemSelected(MainActivity.java:95)
      at android.app.Activity.onMenuItemSelected(Activity.java:3245)
      at android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:406)
      at android.support.v7.app.AppCompatActivity.onMenuItemSelected(AppCompatActivity.java:195)
      at android.support.v7.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java:103)
      at android.support.v7.app.AppCompatDelegateImplV9.onMenuItemSelected(AppCompatDelegateImplV9.java:667)
      at android.support.v7.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:810)
      at android.support.v7.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:152)
      at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:957)
      at android.support.v7.view.menu.MenuPopup.onItemClick(MenuPopup.java:127)
      at android.widget.AdapterView.performItemClick(AdapterView.java:310)
      at android.widget.AbsListView.performItemClick(AbsListView.java:1219)
      at android.widget.AbsListView$PerformClick.run(AbsListView.java:3191)
      at android.widget.AbsListView$3.run(AbsListView.java:4139)
      at android.os.Handler.handleCallback(Handler.java:751)
      at android.os.Handler.dispatchMessage(Handler.java:95)
      at android.os.Looper.loop(Looper.java:241)
      at android.app.ActivityThread.main(ActivityThread.java:6223)
      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)

エラーが出ているのはMainActivity.javaの

mImgUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,values);

このコードのところでおきているようです。

自分で調べて見た所、パーミッションが無いといわれており、AndroidManifest.xmlにパーミッションを追加すればいいらしいのですが、うまくいきません

どなたかご助言お願いいたします。

解決

WRITE_EXTERNAL_STORAGEの様なPermissionはDangerousPermissionと呼ばれており、
Manifestへの記載のほか(Android6.0以降では)ユーザーの許可が必要です。

実装方法の詳細は下記に記載されておりますが。
https://developer.android.com/training/permissions/requesting.html

とりあえず動くところを試したいのであれば
設定>アプリ>(目的のアプリタップ)>権限
から許可してあげれば動くと思います。

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *