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

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

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

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

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

Q&A

1回答

2403閲覧

Androidstudio4.1 PERMISSION_GRANTEDについて

fox8

総合スコア2

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

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

0グッド

0クリップ

投稿2020/11/18 13:22

前提・実現したいこと

AndroidStudio4.1を使い現在位置を緯度経度で表示させるアプリを作っているのですが、Android6.0から位置情報などのセキュリティが必要な機能は、一度ユーザーに利用許可のダイアログを表示して「OK」ボタンを押してもらわないと使えなくなったと思うのですが、その利用許可のチェックをするコードが間違っているとエラーになりました。「PackageManager.PERMISSION_GRANTED」ここが赤字になっています。
いくら調べてもわからないのでお願いします。

発生している問題・エラーメッセージ

Must be one of:PerMissionCheker.PERMISSION_GRANTED,PerMissionCheker.PERMISSION_DENIED,PerMissionCheker.PERMISSION_DENIED_APP_OP

エラーメッセージ

該当のソースコード

LocationEx.java

1package net.npaka.locationex; 2 3import android.Manifest; 4import android.app.Activity; 5import android.content.Context; 6import android.content.pm.PackageManager; 7import android.graphics.Color; 8import android.location.Location; 9import android.location.LocationListener; 10import android.location.LocationManager; 11import android.os.Bundle; 12import android.view.ViewGroup; 13import android.view.Window; 14import android.widget.LinearLayout; 15import android.widget.TextView; 16import androidx.core.app.ActivityCompat; 17import androidx.core.content.PermissionChecker; 18//位置情報の取得 19public class LocationEx extends Activity implements LocationListener{ 20 private final static String BR = System.getProperty("line.separator"); 21 private final static int WC = ViewGroup.LayoutParams.WRAP_CONTENT; 22 private final static String[] PERMISSIONS = { 23 Manifest.permission.ACCESS_COARSE_LOCATION, 24 Manifest.permission.ACCESS_FINE_LOCATION}; 25 private final static int REQUEST_PERMISSION = 1; 26 private TextView textView;//テキストビュー 27 private LocationManager manager; 28 29 @Override 30 public void onCreate(Bundle bundle){ 31 super.onCreate(bundle); 32 requestWindowFeature(Window.FEATURE_NO_TITLE); 33 34 //レイアウトの作成 35 LinearLayout layout = new LinearLayout(this); 36 layout.setBackgroundColor(Color.WHITE); 37 layout.setOrientation(LinearLayout.VERTICAL); 38 39 //テキストビューの生成 40 textView = new TextView(this); 41 textView.setTextSize(24); 42 textView.setTextColor(Color.BLACK); 43 textView.setLayoutParams(new LinearLayout.LayoutParams(WC,WC)); 44 45 //ロケーションマネージャーの取得 46 manager 47 =(LocationManager)getSystemService(Context.LOCATION_SERVICE); 48 49 //ユーザー利用許可のチェック 50 checkPermissions(); 51 52 } 53 54 //アクティビティ再開時に呼ばれる 55 @Override 56 public void onResume() { 57 super.onResume(); 58 59 //位置情報更新の開始 60 setLocationUpdateEnabled(true); 61 } 62 63 //アクティビティ一時停止時に呼ばれる 64 @Override 65 public void onPause() { 66 super.onPause(); 67 68 //位置情報更新の開始 69 setLocationUpdateEnabled(false); 70 } 71 72 //位置情報を通知する時に呼ばれる 73 public void onLocationChanged(Location location) { 74 //緯度と経度の取得 75 textView.setText("LocationEx>"+BR+ 76 "緯度:"+location.getLatitude()+BR+ 77 "経度:"+location.getLongitude()); 78 } 79 80 //位置情報取得有効化を通知する時に呼ばれる 81 public void onProviderEnabled(String provider) { 82 } 83 84 //位置情報取得無効化を通知する時に呼ばれる 85 public void onProviderDisabled(String provider) { 86 } 87 88 //位置情報更新の開始・停止 89 private void setLocationUpdateEnabled(boolean enabled) { 90 //パーミッションのチェック 91 if (isGranted()) { 92 return; 93 } 94 95 //ロケーションマネージャの登録と解除 96 try { 97 if (enabled) { 98 manager.requestLocationUpdates( 99 LocationManager.NETWORK_PROVIDER, 0, 0, this); 100 } else { 101 manager.removeUpdates(this); 102 } 103 } catch (SecurityException e) { 104 e.printStackTrace(); 105 } 106 } 107 108 //ユーザーの利用許可のチェック 109 private void checkPermissions() { 110 //未許可 111 if(!isGranted()) { 112 //許可ダイアログの表示 113 ActivityCompat.requestPermissions(this, PERMISSIONS, 114 REQUEST_PERMISSION); //エラー場所 115 } 116 } 117 118 //ユーザーの利用許可が済かどうかの取得 119 private boolean isGranted() 120 { 121 for (int i = 0; i<PERMISSIONS.length; i++) { 122 if (PermissionChecker.checkSelfPermission(LocationEx.this, PERMISSIONS[i]) != 123 PackageManager.PERMISSION_GRANTED) { 124 return false; 125 } 126 } 127 return true; 128 } 129 130 //許可ダイアログ選択時に呼ばれる 131 @Override 132 public void onRequestPermissionsResult(int requestCode, 133 String[] permissions, int[] results) { 134 if (requestCode == REQUEST_PERMISSION) { 135 //未許可 136 if (isGranted()) { 137 textView.setText("LocationEx>"+BR+ 138 "位置情報の取得が未許可です"); 139 } 140 } else{ 141 super.onRequestPermissionsResult( 142 requestCode, permissions, results); 143 } 144 } 145}

AndroidManifest.xml

1<?xml version="1.0" encoding="utf-8"?> 2<manifest xmlns:android="http://schemas.android.com/apk/res/android" 3 package="net.npaka.locationex"> 4 5 6 <uses-permission android:name="android.permission.INTERNET"/> 7 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> 8 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 9 10 <application 11 android:allowBackup="false" 12 android:icon="@mipmap/ic_launcher" 13 android:label="@string/app_name" 14 android:supportsRtl="false" 15 android:theme="@style/Theme.LocationEx" 16 android:fullBackupContent="@xml/backup_descriptor"> 17 18 <activity 19 android:label="@string/app_name" 20 android:name=".LocationEx"> 21 <intent-filter> 22 <action android:name="android.intent.action.MAIN" /> 23 <category android:name="android.intent.category.LAUNCHER" /> 24 </intent-filter> 25 </activity> 26 </application> 27 28</manifest>

試したこと

クリーンデバッグや再起動、エラーで検索をかけたりしましたがどれも解決しませんでした。

補足情報

開発環境はAndroidStudio4.1、Windows10、Android Gradle Plugin Ver4.1.0、Gradle Ver6.5.1、エミュレーターはPixel 3 API30です。

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

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

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

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

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

guest

回答1

0

checkSelfPermission()というメソッドを持っているクラスは3つもあるため、どれを用いるのが正解なのかネット上の記事を見ても見解が分かれています。どうしてもPermissionCheckerを用いなければならないケースが生じるのは、targetSdkVersionを23未満にしたアプリを作成する場合のようですが、そのような設定のアプリは現在ではPlayに公開することはできないので、実質的に考える必要性はないようです。そのためか、公式ドキュメントではContextCompatを用いることを推奨しています。

ですから、問題の箇所を、

java

1 if (ContextCompat.checkSelfPermission(LocationEx.this, PERMISSIONS[i]) != 2 PackageManager.PERMISSION_GRANTED) { 3 return false; 4 }

のようにPermissionCheckerの箇所をContextCompatに改めればエラーの赤字表示は消えるのではないでしょうか。

どうしてもPermissionChecker.checkSelfPermission()を用いるのならば、

java

1 if (PermissionChecker.checkSelfPermission(LocationEx.this, PERMISSIONS[i]) != 2 PermissionChecker.PERMISSION_GRANTED) { 3 return false; 4 } 5

のようにして、PermissionCheckerの持つConstantsと比較すればエラーにはならないでしょう。

投稿2020/11/18 16:39

keicha_hrs

総合スコア6768

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

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

fox8

2020/11/19 00:56

ありがとうございます。無事解決できました。 ですが、次は「"LocationEx>"+BR+ "緯度:"+location.getLatitude()+BR+ "経度:"+location.getLongitude()」の部分と「"LocationEx>"+BR+ "位置情報の取得が未許可です"」がDo not concatenate text displayed with setText. Use resource string with placeholders.このようなエラーになりました。 どうしたらよいでしょうか?
keicha_hrs

2020/11/19 13:22

そのメッセージと黄色い着色はワーニングであり、エラーではないので実行には支障はないはずです。この内容だと"String literal in setText can not be translated. Use Android resources instead."と"Do not concatenate text displayed with setText. Use resource string with placeholders."という2つのワーニングが出ることになると思いますが、前者はsetText()の引数に直接文字列を記述せず、strings.xmlのようなリソースファイルに記述することを推奨しているものであり、後者は文字列を+で連結するような記述は推奨しないというものです。ワーニングが出ないように改めることはできますが、先に書いたように実行自体は可能なので、メソッドに @SuppressLint("SetTextI18n") というアノテーションを付与することでひとまずワーニングを抑制することはできます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問