-1

我想讓我的應用程序能夠在用戶單擊請求權限按鈕(btRequest)時請求權限。我在構建應用程序時沒有問題,但在手機上運行應用程序時,我的應用程序停止。檢查權限請求工作得很好,因爲當我點擊btCheck時,我可以得到結果。嘗試請求權限可能會出現什麼問題?如何讓我的應用程序申請許可?

Logcat file

private Context context; 
private Activity activity; 
private static final int PERMISSION_REQUEST_CODE = 1; 
private View view; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 


    Button btRequest = (Button)findViewById(R.id.btRequest); 
    Button btCheck = (Button)findViewById(R.id.btCheck); 
    btRequest.setOnClickListener(this); 
    btCheck.setOnClickListener(this); 

} 

@Override 
public void onClick(View v) { 

    view = v; 

    int id = v.getId(); 
    switch (id){ 
     case R.id.btCheck: 
      if (checkPermission()) { 

       Snackbar.make(view,"Permission already granted.",Snackbar.LENGTH_LONG).show(); 

      } else { 

       Snackbar.make(view,"Please request permission.",Snackbar.LENGTH_LONG).show(); 
      } 
      break; 
     case R.id.btRequest: 
      if (!checkPermission()) { 

       requestPermission(); 

      } else { 

       Snackbar.make(view,"Permission already granted.",Snackbar.LENGTH_LONG).show(); 

      } 
      break; 
    } 
} 

private boolean checkPermission(){ 
    int result = ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION); 
    if (result == PackageManager.PERMISSION_GRANTED){ 

     return true; 

    } else { 

     return false; 

    } 
} 

private void requestPermission(){ 

    if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this,Manifest.permission.ACCESS_FINE_LOCATION)){ 

     Toast.makeText(context,"GPS permission allows us to access location data." + 
       " Please allow in App Settings for additional functionality.", Toast.LENGTH_LONG).show(); 

    } else { 

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

@Override 
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { 
    switch (requestCode) { 
     case PERMISSION_REQUEST_CODE: 
      if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

       Snackbar.make(view,"Permission Granted, Now you can access location data.",Snackbar.LENGTH_LONG).show(); 

      } else { 

       Snackbar.make(view,"Permission Denied, You cannot access location data.",Snackbar.LENGTH_LONG).show(); 

      } 
      break; 
    } 
} 
} 

回答

1

檢查構建OS版本(無需徵得同意爲您的操作系統版本< 23)

步驟1:(檢查操作系統版本)

if(android.os.Build.VERSION.SDK_INT >= 23) 
    { 
     checkAndRequestPermissions(); 
    } 

步驟2:(問權限)

private boolean checkAndRequestPermissions() 
{ 
    int permissionSendMessage = ContextCompat.checkSelfPermission(this,Manifest.permission.CAMERA); 
    int locationPermission = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION); 
    int storagePermission = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE); 
    List<String> listPermissionsNeeded = new ArrayList<>(); 
    if (locationPermission != PackageManager.PERMISSION_GRANTED) { 
     listPermissionsNeeded.add(Manifest.permission.ACCESS_FINE_LOCATION); 
    } 
    if (permissionSendMessage != PackageManager.PERMISSION_GRANTED) { 
     listPermissionsNeeded.add(Manifest.permission.CAMERA); 
    } 
    if (storagePermission != PackageManager.PERMISSION_GRANTED) { 
     listPermissionsNeeded.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); 
    } 
    if (!listPermissionsNeeded.isEmpty()) { 
     ActivityCompat.requestPermissions(this, listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]),permsRequestCode); 
     return false; 
    } 
    return true; 
} 

步驟3 :(覆蓋方法執行)

@Override 
public void onRequestPermissionsResult(int requestCode, 
             String permissions[], int[] grantResults) { 
    switch (requestCode) { 
     case 200: { 

      Map<String, Integer> perms = new HashMap<>(); 
      // Initialize the map with both permissions 
      perms.put(Manifest.permission.CAMERA, PackageManager.PERMISSION_GRANTED); 
      perms.put(Manifest.permission.ACCESS_FINE_LOCATION, PackageManager.PERMISSION_GRANTED); 
      perms.put(Manifest.permission.WRITE_EXTERNAL_STORAGE, PackageManager.PERMISSION_GRANTED); 
      // Fill with actual results from user 
      if (grantResults.length > 0) { 
       for (int i = 0; i < permissions.length; i++) 
        perms.put(permissions[i], grantResults[i]); 
       // Check for both permissions 
       if (perms.get(Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED 
         && perms.get(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED 
         && perms.get(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { 
        // process the normal flow 
        //else any one or both the permissions are not granted 
        waitAndNavigateToOnboardingTutorial(); 
       } else { 
        //permission is denied (this is the first time, when "never ask again" is not checked) so ask again explaining the usage of permission 

// // shouldShowRequestPermissionRationale將返回true //顯示對話框或小吃吧並稱其必要的,然後再試一次,否則繼續設定。 如果(ActivityCompat.shouldShowRequestPermissionRationale(此,Manifest.permission.CAMERA)|| ActivityCompat.shouldShowRequestPermissionRationale(此,Manifest.permission.ACCESS_FINE_LOCATION) || ActivityCompat.shouldShowRequestPermissionRationale(此,Manifest.permission.WRITE_EXTERNAL_STORAGE)){ showDialogOK(」相機,需要爲這個應用程序」, 新DialogInterface.OnClickListener(){ @覆蓋 公共無效的onClick(DialogInterface對話,詮釋其){ 臺交換機(){ 情況DialogInterface.BUTTON_POSITIVE存儲和位置服務權限: checkAndRequestPermissions (); b reak; case DialogInterface.BUTTON_NEGATIVE: //通過禁用相關功能或退出應用程序來處理邏輯。 休息; } } }); } // 權限被拒絕(永不再次詢問被檢查) // shouldShowRequestPermissionRationale將返回false 其他{ Toast.makeText(這一點, 「去設置並啓用權限」,Toast.LENGTH_LONG) .show( ); // //通過禁用相關功能或退出應用程序來處理邏輯。 } } } } }

} 

步驟4:

private void showDialogOK(String message, DialogInterface.OnClickListener okListener) { 
    new AlertDialog.Builder(this) 
      .setMessage(message) 
      .setPositiveButton("OK", okListener) 
      .setNegativeButton("Cancel", okListener) 
      .create() 
      .show(); 
} 
0

或許這是與使用

ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION); 

代替

ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION); 

它修好了我,當我有一個類似的問題。

這真的很難說沒有你的logcat的內容。試着告訴我們究竟發生了什麼。如有必要,我會編輯這個答案。

+0

[查看logcat的文件(https://gist.github.com/maggz69/afaf1e03c4db2361e3eb6c77bbd23066#file-logcat) – user145490

0
private boolean requestPermission() { 
    int hasLocationPermission = ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION); 
    if (hasLocationPermission != PackageManager.PERMISSION_GRANTED) { 
     if (!ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION)) { 
      showMessageOKCancel(getResources().getString(R.string.phone_permission_needed), 
        new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialog, int which) { 
          switch (which) { 
           case DialogInterface.BUTTON_POSITIVE: 
            ActivityCompat.requestPermissions(activity, new String[] {Manifest.permission.ACCESS_FINE_LOCATION}, 
              REQUEST_CODE_SOME_FEATURES_PERMISSIONS); 
            break; 
           case DialogInterface.BUTTON_NEGATIVE: 
            // proceed with logic by disabling the related features or quit the app. 
            errorMessage.setText("Permissions not provided or permanently denied earlier."); 
            providePermissions.setVisibility(View.VISIBLE); 
            break; 
          } 
         } 
        }); 
      return false; 
     } 
     ActivityCompat.requestPermissions(this, new String[] {Manifest.permission.ACCESS_FINE_LOCATION}, 
       REQUEST_CODE_SOME_FEATURES_PERMISSIONS); 
     return false; 
    } 
    return true; 
} 

一兩件事我注意到錯在你的代碼中,你只問權限時,「shouldShowRequestPermissionRationale」條件是假的。無論如何,你必須要求權限。這是一個工作代碼。你可以試試這個。

相關問題