-3

Я получаю эту ошибку после того, как попытаюсь обновить мою команду compileSdkVersion иTargetSdkversion больше 22. Похоже, что я выполняю какую-либо задачу GUI в моем методе doInBackground, но я неспособный понять это. Я был бы очень благодарен за решение.FATAL EXCEPTION: java.lang.SecurityException: требуется разрешение ACCESS_COARSE_LOCATION или ACCESS_FINE_LOCATION

Это моя трассировка стеки:

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)  

метод в классе WlanInfoAdapter.java:72 здесь:

@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; 
    } 

Метод в changeableArrayAdapter.java ошибке класса показа приводится ниже. его метод где 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

Добавьте их в свой AndroidManifest.xml перед application тегом

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

Также для Android версии> = 23, вам необходимо запросить разрешения на время выполнения

 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 окончательную переменную staic и установить ее значение в 1 ?? – LanguageMaster

+0

@LanguageMaster да, это точно, что это такое –

+0

Ты отличный Манн. Вы сделали мой день. Спасибо alot .. работает – LanguageMaster

0

Вам нужно добавить ACCESS_COARSE_LOCATION или ACCESS_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 Зефир (Api 23 и выше) вам нужно предоставить разрешение на выполнение в вашем приложении.

+0

спасибо за ваш ответ. Я уже добавил, что два разрешения в моем файле манифеста. Тем не менее мое приложение рушится. Я думаю, что попробую предоставить разрешение на выполнение во время моего приложения. я хотел бы спросить, так это то, что вы говорите о https://developer.android.com/training/permissions/requesting.html, если нет, пожалуйста, предоставьте мне правильную ссылку, если это возможно. было бы очень благодарно – LanguageMaster

+0

Да это только. Или вы можете сообщить об этом на том, как добавить разрешение на использование в грубом месте в android. –

 Смежные вопросы

  • Нет связанных вопросов^_^