-3

私は私のdoLBackgroundメソッドで任意のGUIタスクを実行しているようですが、私は私のcompileSdkVersionとTargetTargetSdkversionを22以上に更新しようとしています。それを理解することができません。私は解決策に非常に感謝しています。致命的な例外:java.lang.SecurityException:ACCESS_COARSE_LOCATIONまたはACCESS_FINE_LOCATIONのアクセス許可が必要です

これは私のスタックトレースです:クラスWlanInfoAdapter.java:72で

E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1 
        Process: xy.abc.xyz.xy, PID: 15246 
        java.lang.RuntimeException: An error occurred while executing doInBackground() 
    at android.os.AsyncTask$3.done(AsyncTask.java:309) 
    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:234) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
at java.lang.Thread.run(Thread.java:818) 
Caused by: java.lang.SecurityException: Need ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION permission to get scan results 
at android.os.Parcel.readException(Parcel.java:1599) 
at android.os.Parcel.readException(Parcel.java:1552) 
at android.net.wifi.IWifiManager$Stub$Proxy.getScanResults(IWifiManager.java:1066) at android.net.wifi.WifiManager.getScanResults(WifiManager.java:1311) 
at xy.abc.xyz.xy.config.WlanInfoAdapter.getNewItems(WlanInfoAdapter.java:72) 
         at xy.abc.xyz.xy.android.data.ChangeableArrayAdapter$1.doInBackground(ChangeableArrayAdapter.java:78) 
         at xy.abc.xyz.xy.android.data.ChangeableArrayAdapter$1.doInBackground(ChangeableArrayAdapter.java:74) 
         at android.os.AsyncTask$2.call(AsyncTask.java:295) 
         at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
         at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)  
         at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)  
         at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)  
         at java.lang.Thread.run(Thread.java:818)  

方法はここにある:changeableArrayAdapter.javaクラス示すエラーで

@Override 
    protected List<WlanInfo> getNewItems() { 
     WifiManager wifiManager = (WifiManager) getContext().getSystemService(Context.WIFI_SERVICE); 
     List<ScanResult> scanResults = wifiManager.getScanResults(); 
     List<WlanInfo> infoList = new ArrayList<>(scanResults.size()); 

     WifiInfo connectionInfo = wifiManager.getConnectionInfo(); 

     try { 
      List<WifiConfiguration> configuredNetworks = wifiManager.getConfiguredNetworks(); 
      Map<String, WifiConfiguration> configuredNetworkIds = new HashMap<>(); 
      for (WifiConfiguration configuredNetwork : configuredNetworks) { 
       if (configuredNetwork.SSID != null) { 
        configuredNetworkIds.put(WlanInfo.cleanSSID(configuredNetwork.SSID), configuredNetwork); 
       } else { 

        wifiManager.removeNetwork(configuredNetwork.networkId); 
       } 
      } 

      for (ScanResult scanResult : scanResults) { 
       WlanInfo wlanInfo = new WlanInfo(scanResult); 
       WifiConfiguration configuration = configuredNetworkIds.get(wlanInfo.getSSID()); 
       wlanInfo.setConfiguration(configuration); 
       wlanInfo.setIsActive(configuration != null && configuration.networkId == connectionInfo.getNetworkId()); 


       if (showUnknown || wlanInfo.isConfigured() || wlanInfo.isOpen()) { 
        infoList.add(wlanInfo); 
       } 
      } 
     } 
     catch (Exception e) { e.printStackTrace(); return null; } 
     return infoList; 
    } 

方法は以下のとおりです。そのgetNewItems()メソッドが呼び出されます。 ChangeableArrayAdapter.java:78 ChangeableArrayAdapter.java:74

public void triggerRefresh() { 
     AsyncTask<Void, Void, List<T>> asyncTask = new AsyncTask<Void, Void, List<T>>() { 
      @Override 
      protected List<T> doInBackground(Void... objects) { 


       return getNewItems(); 

       //return null; 
      } 

答えて

0

Androidのバージョン> = 23

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

また、あなたのAndroidManifest.xmlapplication前のタグにこれらを追加し、あなたは、実行時に権限を要求する必要が

 if (ContextCompat.checkSelfPermission(YourActivity.this, 
          Manifest.permission.ACCESS_FINE_LOCATION) 
          != PackageManager.PERMISSION_GRANTED 
          && 
          ContextCompat.checkSelfPermission(YourActivity.this, 
            Manifest.permission.ACCESS_COARSE_LOCATION) 
            != PackageManager.PERMISSION_GRANTED) { 
         askForLocationPermissions(); 
     } else { 
      //do your work 
    } 

そして

private void askForLocationPermissions() { 

     // Should we show an explanation? 
     if (ActivityCompat.shouldShowRequestPermissionRationale(this, 
       Manifest.permission.ACCESS_FINE_LOCATION)) { 

      new android.support.v7.app.AlertDialog.Builder(this) 
        .setTitle("Location permessions needed") 
        .setMessage("you need to allow this permission!") 
        .setPositiveButton("Sure", new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int which) { 
          ActivityCompat.requestPermissions(YourActivity.this, 
            new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 
            LOCATION_PERMISSION_REQUEST_CODE); 
         } 
        }) 
        .setNegativeButton("Not now", new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int which) { 
//          //Do nothing 
         } 
        }) 
        .show(); 

      // Show an expanation to the user *asynchronously* -- don't block 
      // this thread waiting for the user's response! After the user 
      // sees the explanation, try again to request the permission. 

     } else { 

      // No explanation needed, we can request the permission. 
      ActivityCompat.requestPermissions(this, 
        new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 
        LOCATION_PERMISSION_REQUEST_CODE); 

      // MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION is an 
      // app-defined int constant. The callback method gets the 
      // result of the request. 
     } 
    } 

また

@Override 
    public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) { 
     switch (requestCode) { 
      case LOCATION_PERMISSION_REQUEST_CODE: 
       if (isPermissionGranted(permissions, grantResults, Manifest.permission.ACCESS_FINE_LOCATION)) { 
        //Do you work 
       } else { 
        Toast.makeText(this, "Can not proceed! i need permission" , Toast.LENGTH_SHORT).show(); 
       } 
       break; 
     } 
    } 

そして

public static boolean isPermissionGranted(@NonNull String[] grantPermissions, @NonNull int[] grantResults, 
               @NonNull String permission) { 
     for (int i = 0; i < grantPermissions.length; i++) { 
      if (permission.equals(grantPermissions[i])) { 
       return grantResults[i] == PackageManager.PERMISSION_GRANTED; 
      } 
     } 
     return false; 
    } 
+0

あなたの完全な説明をありがとう。私はLOCATION_PERMISSION_REQUEST_CODE最終的な変数を作成し、その値を1に設定する必要があるかどうかを知りたいですか? – LanguageMaster

+0

@LanguageMasterはい、それはまさにそれです –

+0

あなたは素晴らしいマンです。あなたは私の一日を作った。どうもありがとうございます。仕事は – LanguageMaster

0

あなたはあなたのAndroidマニフェストファイルへのアクセス権としてACCESS_COARSE_LOCATIONACCESS_FINE_LOCATIONを追加する必要があります。

+0

おかげで、あなたが答えるために。 – LanguageMaster

0

あなたはAPI 22をターゲットにしている場合にのみ、あなたはあなたのアンドロイドマニフェストファイルでこれら2 許可を追加する必要が

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

そして、あなたはAndroidのマシュマロ(上記アピ23と)のために標的にされている場合あなたのアプリでランタイムパーミッションを与える必要があります。

+0

あなたの答えに感謝します。私はすでにマニフェストファイルに2つの権限を追加しました。それでも私のアプリはクラッシュしています。私は私のアプリケーションでランタイムのアクセス許可を与えることを試みると思う。私はあなたがhttps://developer.android.com/training/permissions/requesting.htmlについて話していることを尋ねたいと思います。もし可能であれば私に正しいリンクを提供してください。非常に感謝します – LanguageMaster

+0

はいこれだけです。または、あなたはアンドロイドの粗い場所の実行時の許可を追加する方法については、Googleにすることができます –

関連する問題