質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

2回答

2802閲覧

Android Studio の Permissionの設定について

kuma_dansyaku

総合スコア18

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2017/07/18 02:42

いつもお世話になっています。

端末のあるフォルダ内に入れた画像のサムネイルをViewImageに表示させるサンプルアプリを作りました。
しかし起動してみると「問題が発生したため、アプリを終了します。」と表示され落ちました。

ログを見ると

java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/images/media from pid=20506, uid=10086 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission()とあったので
AndroidManifest.xmlに<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />を追加しましたが、同様の現象と同様のエラーメッセージが発生して解決しません。
何が悪いのかご教授下さい。

Android Stduio: v2.3.3
compileSdkVersion 26
buildToolsVersion "26.0.0"
minSdkVersion 19
targetSdkVersion 26

端末のトップにsampleフォルダを作ってsample.jpgを入れておく

xml

1<?xml version="1.0" encoding="utf-8"?> 2<manifest xmlns:android="http://schemas.android.com/apk/res/android" 3 package="example.com.tumbnailsample"> 4 5 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 6 7 <application 8 android:allowBackup="true" 9 android:icon="@mipmap/ic_launcher" 10 android:label="@string/app_name" 11 android:roundIcon="@mipmap/ic_launcher_round" 12 android:supportsRtl="true" 13 android:theme="@style/AppTheme"> 14 <activity android:name=".MainActivity"> 15 <intent-filter> 16 <action android:name="android.intent.action.MAIN"/> 17 18 <category android:name="android.intent.category.LAUNCHER"/> 19 </intent-filter> 20 </activity> 21 </application> 22 23</manifest>

java

1package example.com.tumbnailsample; 2 3import android.content.ContentResolver; 4import android.database.Cursor; 5import android.graphics.Bitmap; 6import android.os.Bundle; 7import android.os.Environment; 8import android.provider.MediaStore; 9import android.support.v7.app.AppCompatActivity; 10import android.widget.ImageView; 11 12public class MainActivity extends AppCompatActivity { 13 14 @Override 15 protected void onCreate(Bundle savedInstanceState) { 16 super.onCreate(savedInstanceState); 17 setContentView(R.layout.activity_main); 18 19 ImageView imageView = (ImageView)findViewById(R.id.imageView); 20 // データ/キャッシュ/外部ストレージ/システムのパスを取得するにはEnvironmentクラスを使用します 21 String fname = Environment.getExternalStorageDirectory().getPath() + "/sample/sample.jpg"; // ファイルIDの取得 22 23 24 // ファイルIDの取得 25 ContentResolver resolver = getContentResolver(); 26 Cursor cursor = resolver.query( 27 MediaStore.Images.Media.EXTERNAL_CONTENT_URI, // データの種類 28 null, // 項目(null=全項目) 29 MediaStore.Images.ImageColumns.DATA + " = ?", // フィルタ条件(null=フィルタなし) 30 new String[]{fname}, // フィルタ用パラメータ 31 null // ソート 32 ); 33 // cursorの一番最初に移動する 34 if(cursor.moveToFirst()){ 35 // サムネイルの取得 36 long id = cursor.getLong(cursor.getColumnIndex("_id")); 37 Bitmap thumbnail = MediaStore.Images.Thumbnails.getThumbnail(resolver, id, MediaStore.Images.Thumbnails.MICRO_KIND, null); 38 imageView.setImageBitmap(thumbnail); 39 } 40 } 41}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

Android6.0以降ではマニフェストにパーミッションを書いても、パーミッションは付与されません。
実行時にユーザーの許可を得てパーミッションを付与する必要があります。
実行時のパーミッション リクエスト

また、本当に上記が原因かを確認するためにAndroid端末の設定アプリからあなたのアプリを選択し、パーミッションを付与してください。正常に動く場合は上記が原因となります。

投稿2017/07/18 02:56

yona

総合スコア18155

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kuma_dansyaku

2017/07/18 03:57

返信ありがとうございます。 確認用に使用しているAndroid端末のバージョンが6.0.1なので間違いなさそうです。 Dangerous Permissionって言うみたいですね。 カレンダー、カメラ、GPS、電話などのPermissionが対象となっているみたいですね。 この辺のデザインパターンを探していたのでリンク先を参照させていただきます。 ありがとうございました。
guest

0

えっと、多分惜しい所までいってるのですが、エラーメッセージを見る限り、
WRITE_EXTERNAL_STORAGEではなく、READ_EXTERNAL_STORAGEではないでしょうか?

下記を追記してみて下さい。

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

投稿2017/07/18 02:56

rafiene3249

総合スコア53

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kuma_dansyaku

2017/07/18 03:56

ご指摘ありがとうございます。 調べ直しましたがWRITE_EXTERNAL_STORAGEで間違いないです。 すみません。 コピペの箇所を自分が間違えていたみたいです。
rafiene3249

2017/07/18 04:15 編集

既に回答済みではありますがサンプルコードを張っておきます。 @Override protected void onResume() { super.onResume(); boolean req = false; // androidのバージョン次第で以下のパーミッション取得を行う if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // 既に許可されているか確認 if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { req = true; } if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { req = true; } if (checkSelfPermission(Manifest.permission.INTERNET) != PackageManager.PERMISSION_GRANTED) { req = true; } if( req ) { // 許可されていなかったらリクエストする requestPermissions( new String[]{ Manifest.permission.INTERNET, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE }, PERMISSIONS_REQUEST_CODE_WRITE_EXTERNAL_STORAGE); return; } } } @Override public void onRequestPermissionsResult( int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == PERMISSIONS_REQUEST_CODE_WRITE_EXTERNAL_STORAGE && grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED && grantResults[2] == PackageManager.PERMISSION_GRANTED) { // 許可された場合 Log.d("デバッグ","諸々許可されましたよ"); } else { // 許可されなかった場合はタスクを終了させる finishAndRemoveTask(); } }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問