###前提・実現したいこと
Androidで位置情報をGoogleMapに描画するアプリを作成しています。その時に、LocationManagerから位置情報をAsyncTaskを用いて非同期的に取得したいと思っています。ここのサイトを参考にプログラムを作成したのですが、エラーが発生してしまいました。同期処理であればlocationmanagerを使って位置情報を取得できています。どうかご教授お願い致します。
###発生している問題・エラーメッセージ
E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1 Process: test.com.myapplication, PID: 6305 java.lang.RuntimeException: An error occurred while executing doInBackground() at android.os.AsyncTask$3.done(AsyncTask.java:318) at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354) at java.util.concurrent.FutureTask.setException(FutureTask.java:223) at java.util.concurrent.FutureTask.run(FutureTask.java:242) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) at java.lang.Thread.run(Thread.java:761) Caused by: java.lang.SecurityException: "gps" location provider requires ACCESS_FINE_LOCATION permission. at android.os.Parcel.readException(Parcel.java:1683) at android.os.Parcel.readException(Parcel.java:1636) at android.location.ILocationManager$Stub$Proxy.getLastLocation(ILocationManager.java:725) at android.location.LocationManager.getLastKnownLocation(LocationManager.java:1205) at test.com.myapplication.Asyn.doInBackground(Asyn.java:61) at test.com.myapplication.Asyn.doInBackground(Asyn.java:16) at android.os.AsyncTask$2.call(AsyncTask.java:304) at java.util.concurrent.FutureTask.run(FutureTask.java:237) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) at java.lang.Thread.run(Thread.java:761)
###該当のソースコード
java
1package test.com.myapplication; 2 3import android.Manifest; 4import android.app.Activity; 5import android.content.Context; 6import android.content.pm.PackageManager; 7import android.location.Criteria; 8import android.location.Location; 9import android.location.LocationListener; 10import android.location.LocationManager; 11import android.os.AsyncTask; 12import android.os.Bundle; 13import android.support.v4.app.ActivityCompat; 14 15 16public class Asyn extends AsyncTask<Void, Void, Void> implements LocationListener { 17 18 public Location mlocation; 19 double latitude, longitude; 20 private Activity MainActivity; 21 private Context ContextAsync; 22 public LocationManager locManAsyn; 23 String pro; 24 25 public Asyn(Context context) { 26 this.ContextAsync = context.getApplicationContext(); 27 } 28 29 @Override 30 protected Void doInBackground(Void... voids) { 31 locManAsyn = (LocationManager) ContextAsync.getSystemService(ContextAsync.LOCATION_SERVICE); 32 Criteria criteria = new Criteria(); 33 criteria.setAccuracy(Criteria.ACCURACY_COARSE); 34 criteria.setCostAllowed(false); 35 criteria.setPowerRequirement(Criteria.NO_REQUIREMENT); 36 pro = locManAsyn.getBestProvider(criteria, false); 37 if (locManAsyn.isProviderEnabled(LocationManager.GPS_PROVIDER)) { 38 pro = LocationManager.GPS_PROVIDER; 39 } else if (locManAsyn.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) { 40 pro = LocationManager.NETWORK_PROVIDER; 41 /*AlertDialog.Builder alert = new AlertDialog.Builder(this); 42 alert.setTitle("GPS is disabled in the settings!"); 43 alert.setMessage("It is recomended that you turn on your device's GPS and restart the app so the app can determine your location more accurately!"); 44 alert.setPositiveButton("OK", null); 45 alert.show();*/ 46 } else if (locManAsyn.isProviderEnabled(LocationManager.PASSIVE_PROVIDER)) { 47 pro = LocationManager.PASSIVE_PROVIDER; 48 //Toast.makeText(ContextAsync, "Switch On Data Connection!!!!", Toast.LENGTH_LONG).show(); 49 } 50 51 if (ActivityCompat.checkSelfPermission(this.ContextAsync, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this.ContextAsync, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 52 // TODO: Consider calling 53 // ActivityCompat#requestPermissions 54 // here to request the missing permissions, and then overriding 55 // public void onRequestPermissionsResult(int requestCode, String[] permissions, 56 // int[] grantResults) 57 // to handle the case where the user grants the permission. See the documentation 58 // for ActivityCompat#requestPermissions for more details. 59 //return TODO; 60 } 61 mlocation = locManAsyn.getLastKnownLocation(pro); 62 if (mlocation == null) { 63 latitude = mlocation.getLatitude(); 64 longitude = mlocation.getLongitude(); 65 } 66 return null; 67 } 68 69 @Override 70 public void onLocationChanged(Location location) { 71 72 if (ActivityCompat.checkSelfPermission(this.ContextAsync, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this.ContextAsync, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 73 // TODO: Consider calling 74 // ActivityCompat#requestPermissions 75 // here to request the missing permissions, and then overriding 76 // public void onRequestPermissionsResult(int requestCode, String[] permissions, 77 // int[] grantResults) 78 // to handle the case where the user grants the permission. See the documentation 79 // for ActivityCompat#requestPermissions for more details. 80 return; 81 } 82 locManAsyn.requestLocationUpdates(pro, 0, 0, this); 83 } 84 85 @Override 86 public void onStatusChanged(String s, int i, Bundle bundle) { 87 88 } 89 90 @Override 91 public void onProviderEnabled(String s) { 92 93 } 94 95 @Override 96 public void onProviderDisabled(String s) { 97 98 } 99 100 @Override 101 protected void onPreExecute() { 102 103 super.onPreExecute(); 104 } 105 106 @Override 107 protected void onPostExecute(Void aVoid) { 108 super.onPostExecute(aVoid); 109 onLocationChanged(mlocation); 110 } 111} 112
###補足情報(言語/FW/ツール等のバージョンなど)
AndroidSrudio3.0
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/11/15 22:39
2017/11/16 02:24
2017/11/16 08:11
2017/11/16 10:13 編集
2017/11/16 10:25 編集
2017/11/16 13:20
2017/11/16 14:27
2017/11/16 14:34
2017/11/16 14:56
2017/11/16 15:27
2017/11/16 16:50
2017/11/17 00:02
2017/11/17 08:22