2017-07-14 60 views
-1

的AndroidManifest.xml:的Android的PermissionCheck不工作

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

代碼:

button.setOnClickListener { 
var permissionCheck = ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) 
if (permissionCheck == PackageManager.PERMISSION_GRANTED) { 
    toast("success") 
} else { 
    toast("fail")}} 

爲什麼會出現這種迴歸 「失敗」?

+1

檢查運行時pe如果操作系統版本是棉花糖或刨絲器 –

+0

對於OS <(API 23),您應該始終獲得PERMISSION_GRANTED –

回答

0

請求的權限對我來說太混亂,EasyPermissions解決了我所有的問題

清單:

compile 'pub.devrel:easypermissions:0.4.2' 

代碼:

button.setOnClickListener { 
    if (EasyPermissions.hasPermissions(this, Manifest.permission.ACCESS_FINE_LOCATION)) { 
     toast("yes !") 
    } else { 
     EasyPermissions.requestPermissions(this, getString(R.string.location_perm), 1, Manifest.permission.ACCESS_FINE_LOCATION) 
    }} 

工作完美的第一次嘗試

0

對於Android 6.0+targetSdk=23您必須考慮要求運行時權限。權限android.permission.ACCESS_FINE_LOCATION被認爲是危險的,所以你必須在運行時詢問它。有關概述,請參見Normal and Dangerous Permissions

你需要做的是在運行時詢問它,例如,

從更多在這裏Requesting Permissions at Run Time

0

在這種情況下,你應該要求如允許開發人員指南

// Here, thisActivity is the current activity 
if (ContextCompat.checkSelfPermission(thisActivity, 
       Manifest.permission.READ_CONTACTS) 
     != PackageManager.PERMISSION_GRANTED) { 

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

     // Show an explanation 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(thisActivity, 
       new String[]{Manifest.permission.READ_CONTACTS}, 
       MY_PERMISSIONS_REQUEST_READ_CONTACTS); 

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

ActivityCompat.requestPermissions(thisActivity, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_CODE); ,你應該在onRequestPermissionsResult回調得到答案。 然後,如果用戶授予權限,下次您將使用checkSelfPermission方法時,您將獲得success

有關詳細信息閱讀:https://developer.android.com/training/permissions/requesting.html

0

看來你正在使用的目標SDK> = 23,並與API級別也> = 23設備上運行的應用程序。因此,由於api 23有新的流程來重新獲得權限。權限分爲正常和危險兩類。危險的權限應在運行時問這樣的: ActivityCompat.requestPermissions(thisActivity, new String[]{Manifest.permission.READ_CONTACTS}, MY_PERMISSIONS_REQUEST_LOCATION);

這將顯示用戶系統對話框: Android 6.0 runtime permissions dialog

所以導致用戶的選擇將返回到public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults)

這樣,您通過請求代碼在ActivityCompat.requestPermissions中,在我的情況下,它是MY_PERMISSIONS_REQUEST_LOCATION

權限的名稱將在字符串權限[]和用戶的選擇將按照y in int [] grantResults,可以是PackageManager.PERMISSION_GRANTED或PERMISSION_DENIED。

此外,向用戶解釋爲什麼您在獲得該權限之前需要該權限是很好的。

查看更多在這裏:Requesting Permissions at Run Time

0

您可以檢查後許可/在安卓6.0

public class MainActivity extends AppCompatActivity { 

    private final int PERMISSIONS_CODE = 1001; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     Button button = (Button) findViewById(R.id.button1); 
     button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { 

       ActivityCompat.requestPermissions(MainActivity.this, new String[]{android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION,}, PERMISSIONS_CODE); 

      } else { 

       // You can do you operation directly. If you added permissions in AndroidManifest... 
       // Or visit following link to read about permission check. 
       // https://stackoverflow.com/questions/7203668/how-permission-can-be-checked-at-runtime-without-throwing-securityexception 

      } 
     } 
    }); 
    } 

    @Override 
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
    switch (requestCode) { 
     case PERMISSIONS_CODE: 
      if (grantResults.length > 0 && grantResults[grantResults.length-1] == PackageManager.PERMISSION_GRANTED) { 
       Log.d("permission", "accepted"); 
      } else { 
       Log.d("permission", "denied"); 
      } 
      break; 
     default: 
      super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
      break; 
    } 
} 

} 

快樂編碼...

0

爲Android 6。0和你targetSdkVersion> = 23,則應該在運行時徵得同意,我有兩個提醒: 1,您可以更改模型gradle這個文件你targetSdkVersion,如:

targetSdkVersion=22 

,但我不推薦使用這種方法。 2,這個返回'失敗'表示你沒有這個權限,你應該考慮如果你有請求但用戶拒絕,在這個你可以顯示一個對話框告訴用戶,爲什麼你需要這個perssion,然後請求permession你願意,你可以用下面這段代碼:

private boolean check(){ 
 
     if(ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)== PackageManager.PERMISSION_GRANTED){ 
 
      //you have this permession 
 
      return true; 
 
     }else{ 
 
      //don't hava permession ,you shoud check if you can request 
 
      if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION)) { 
 
       //the use refuse you request this permission ,the system well't show request dialog,you shoul show a dialog tu explain why you need this permission 
 
       //and guide he go to system setting open this permission. 
 
      }else { 
 
       // you can request permission direct 
 
       //requestCode is a integer code,that you can use is in onRequestPermissionsResult 
 
       ActivityCompat.requestPermissions(this, Manifest.permission.ACCESS_FINE_LOCATION, requestCode); 
 

 
      } 
 

 
     } 
 
     return false; 
 
    } 
 

 
    @Override 
 
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
 
     super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
 
     //in this you can listen the request result 
 
     if(grantResults[0]==PackageManager.PERMISSION_GRANTED){ 
 
      //user Agree permission 
 
     }else{ 
 
      //user reject permission 
 
     } 
 
    }

對不起,我只知道Java的,因此,這段代碼是安裝插件。希望這可以幫助你解決這個問題。

0
public static int CAMERA_PERMISSSION_CODE = 1; 
     public static int STORAGE_PERMISSSION_CODE = 2; 
     public static int FINE_LOCATION_PERMISSSION_CODE = 3; 
     public static int COARSE_LOCATION_PERMISSSION_CODE = 3; 
     public static int READ_PHONESTATE_PERMISSSION_CODE = 4; 




private void askForunTimePermissions() { 

     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 


      if (ContextCompat.checkSelfPermission(PermissionsActivity.this, 
        Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { 


       ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, CAMERA_PERMISSSION_CODE); 

      } else if (ContextCompat.checkSelfPermission(PermissionsActivity.this, 
        Manifest.permission.WRITE_EXTERNAL_STORAGE) 
        != PackageManager.PERMISSION_GRANTED) { 


       requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, STORAGE_PERMISSSION_CODE); 
      } else if (ContextCompat.checkSelfPermission(PermissionsActivity.this, 
        Manifest.permission.ACCESS_FINE_LOCATION) 
        != PackageManager.PERMISSION_GRANTED) { 

       requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, FINE_LOCATION_PERMISSSION_CODE); 
      } else if (ContextCompat.checkSelfPermission(PermissionsActivity.this, 
        Manifest.permission.ACCESS_COARSE_LOCATION) 
        != PackageManager.PERMISSION_GRANTED) { 
       requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, COARSE_LOCATION_PERMISSSION_CODE); 
      } else if (ContextCompat.checkSelfPermission(PermissionsActivity.this, 
        Manifest.permission.READ_PHONE_STATE) 
        != PackageManager.PERMISSION_GRANTED) { 
       requestPermissions(new String[]{Manifest.permission.READ_PHONE_STATE}, READ_PHONESTATE_PERMISSSION_CODE); 
      } else { 



      } 


     } 


    } 


    @Override 
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
     super.onRequestPermissionsResult(requestCode, permissions, grantResults); 

     try { 
      if (requestCode == CAMERA_PERMISSSION_CODE) { 

       if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
        askForunTimePermissions(); 
       } else { 
        askForunTimePermissions(); 
       } 


      } else if (requestCode == STORAGE_PERMISSSION_CODE) { 

       if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
        askForunTimePermissions(); 
       } else { 
        askForunTimePermissions(); 
       } 


      } else if (requestCode == FINE_LOCATION_PERMISSSION_CODE) { 
       if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
        askForunTimePermissions(); 
       } else { 
        askForunTimePermissions(); 
       } 

      } else if (requestCode == COARSE_LOCATION_PERMISSSION_CODE) { 
       if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
        askForunTimePermissions(); 
       } else { 
        askForunTimePermissions(); 
       } 

      } else if (requestCode == READ_PHONESTATE_PERMISSSION_CODE) { 
       if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
        askForunTimePermissions(); 
       } else { 
        askForunTimePermissions(); 
       } 

      } 

     } catch (Exception e) { 
      Toast.makeText(PermissionsActivity.this, "No permission requests matched", Toast.LENGTH_SHORT).show(); 
     } 
    } 


//call this method where u want 
    askForunTimePermissions();