2017-10-09 88 views
0

我正在为android手机编写一个小应用程序,它需要读取外部存储(SD)上的文件。从6.0开始,您必须在运行时请求此权限。问:在运行时请求权限,何时何地?

我做了这个给定的API,但我发现我必须在2个地方调用readfile(),如何改进以避免这种情况?

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


    if (ContextCompat.checkSelfPermission(this,Manifest.permission.READ_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED) 
     ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},1); 
     else { 

      LoadWords("testfile.txt"); 




     } 




} 

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

        LoadWords("testfile.txt"); 

       } else { 
        maxlines = 0; 
        return; 
       } 
       return; 
      } 

    } 
} 

回答

0

您可以用lib:https://github.com/googlesamples/easypermissions

这是权限的例子活动:

import android.Manifest; 
import android.content.Intent; 
import android.os.Bundle; 
import android.support.annotation.NonNull; 
import android.support.v7.app.AppCompatActivity; 
import android.util.Log; 
import android.view.View; 
import android.widget.Toast; 

import java.util.List; 

import pub.devrel.easypermissions.AfterPermissionGranted; 
import pub.devrel.easypermissions.AppSettingsDialog; 
import pub.devrel.easypermissions.EasyPermissions; 

public class MainActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks { 

    private static final String TAG = "MainActivity"; 
    private static final String[] LOCATION_AND_CONTACTS = 
      {Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.READ_CONTACTS}; 

    private static final int RC_CAMERA_PERM = 123; 
    private static final int RC_LOCATION_CONTACTS_PERM = 124; 

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

     // Button click listener that will request one permission. 
     findViewById(R.id.button_camera).setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       cameraTask(); 
      } 
     }); 

     // Button click listener that will request two permissions. 
     findViewById(R.id.button_location_and_contacts).setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       locationAndContactsTask(); 
      } 
     }); 
    } 

    private boolean hasCameraPermission() { 
     return EasyPermissions.hasPermissions(this, Manifest.permission.CAMERA); 
    } 

    private boolean hasLocationAndContactsPermissions() { 
     return EasyPermissions.hasPermissions(this, LOCATION_AND_CONTACTS); 
    } 

    private boolean hasSmsPermission() { 
     return EasyPermissions.hasPermissions(this, Manifest.permission.READ_SMS); 
    } 

    @AfterPermissionGranted(RC_CAMERA_PERM) 
    public void cameraTask() { 
     if (hasCameraPermission()) { 
      // Have permission, do the thing! 
      Toast.makeText(this, "TODO: Camera things", Toast.LENGTH_LONG).show(); 
     } else { 
      // Ask for one permission 
      EasyPermissions.requestPermissions(
        this, 
        getString(R.string.rationale_camera), 
        RC_CAMERA_PERM, 
        Manifest.permission.CAMERA); 
     } 
    } 

    @AfterPermissionGranted(RC_LOCATION_CONTACTS_PERM) 
    public void locationAndContactsTask() { 
     if (hasLocationAndContactsPermissions()) { 
      // Have permissions, do the thing! 
      Toast.makeText(this, "TODO: Location and Contacts things", Toast.LENGTH_LONG).show(); 
     } else { 
      // Ask for both permissions 
      EasyPermissions.requestPermissions(
        this, 
        getString(R.string.rationale_location_contacts), 
        RC_LOCATION_CONTACTS_PERM, 
        LOCATION_AND_CONTACTS); 
     } 
    } 

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

     // EasyPermissions handles the request result. 
     EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this); 
    } 

    @Override 
    public void onPermissionsGranted(int requestCode, List<String> perms) { 
     Log.d(TAG, "onPermissionsGranted:" + requestCode + ":" + perms.size()); 
    } 

    @Override 
    public void onPermissionsDenied(int requestCode, List<String> perms) { 
     Log.d(TAG, "onPermissionsDenied:" + requestCode + ":" + perms.size()); 

     // (Optional) Check whether the user denied any permissions and checked "NEVER ASK AGAIN." 
     // This will display a dialog directing them to enable the permission in app settings. 
     if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) { 
      new AppSettingsDialog.Builder(this).build().show(); 
     } 
    } 

    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 

     if (requestCode == AppSettingsDialog.DEFAULT_SETTINGS_REQ_CODE) { 
      String yes = getString(R.string.yes); 
      String no = getString(R.string.no); 

      // Do something after user returned from app settings screen, like showing a Toast. 
      Toast.makeText(
        this, 
        getString(R.string.returned_from_app_settings_to_activity, 
           hasCameraPermission() ? yes : no, 
           hasLocationAndContactsPermissions() ? yes : no, 
           hasSmsPermission() ? yes : no), 
        Toast.LENGTH_LONG) 
        .show(); 
     } 
    } 
} 

这是很容易使用。 我希望它能帮助你解决问题。

+0

感谢您的建议,我会尽快修复。 – Thientvse

0

像这样

public abstract class AbsRuntimePermission extends AppCompatActivity { 
private SparseIntArray mErrorString; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    mErrorString = new SparseIntArray(); 
} 

public abstract void onPermissionsGranted(int requestCode); 

public void requestAppPermissions(final String[]requestedPermissions, final int stringId, final int requestCode) { 
    mErrorString.put(requestCode, stringId); 

    int permissionCheck = PackageManager.PERMISSION_GRANTED; 
    boolean showRequestPermissions = false; 
    for(String permission: requestedPermissions) { 
     permissionCheck = permissionCheck + ContextCompat.checkSelfPermission(this, permission); 
     showRequestPermissions = showRequestPermissions || ActivityCompat.shouldShowRequestPermissionRationale(this, permission); 
    } 

    if (permissionCheck!=PackageManager.PERMISSION_GRANTED) { 
     if(showRequestPermissions) { 
      Snackbar.make(findViewById(android.R.id.content), stringId, Snackbar.LENGTH_INDEFINITE).setAction("GRANT", new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        ActivityCompat.requestPermissions(AbsRuntimePermission.this, requestedPermissions, requestCode); 
       } 
      }).show(); 
     } else { 
      ActivityCompat.requestPermissions(this, requestedPermissions, requestCode); 
     } 
    } else { 
     onPermissionsGranted(requestCode); 
    } 
} 

@Override 
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
    super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    int permissionCheck = PackageManager.PERMISSION_GRANTED; 
    for(int permisson : grantResults) { 
     permissionCheck = permissionCheck + permisson; 
    } 

    if((grantResults.length > 0) && PackageManager.PERMISSION_GRANTED == permissionCheck) { 
     onPermissionsGranted(requestCode); 
    } else { 
     //Display message when contain some Dangerous permisson not accept 
     Snackbar.make(findViewById(android.R.id.content), mErrorString.get(requestCode), 
       Snackbar.LENGTH_INDEFINITE).setAction("ENABLE", new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Intent i = new Intent(); 
       i.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); 
       i.setData(Uri.parse("package:" + getPackageName())); 
       i.addCategory(Intent.CATEGORY_DEFAULT); 
       i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
       i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); 
       i.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); 
       startActivity(i); 
      } 
     }).show(); 
    } 
} 

覆盖方法}

创建这样一个抽象类,并在主

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_hallfinder); 

    requestAppPermissions(new String[]{ 
        Manifest.permission.READ_CONTACTS, 
        Manifest.permission.READ_PHONE_STATE,}, 
      R.string.msg, REQUEST_PERMISSION); 

} 

希望它会帮助你

相关问题