2017-02-08 72 views
0

我在我的应用双许可,它们是基于访问相机外部存储但我面临的问题应该是如何,只有相机权限问何时应用程序启动并且其他许可不被要求。我俱乐部的Android权限相机和外部存储

但在第二阶段,当我运行应用程序时,它询问第二个许可。

public class MainActivity extends AppCompatActivity { 

private DrawerLayout mDrawer; 
private Toolbar toolbar; 
private NavigationView nvDrawer; 
private ActionBarDrawerToggle drawerToggle; 

private static final int REQUEST_CAMERA = 0; 
private static final int REQUEST_EXTERNAL_STORAGE = 1; 

private static String[] PERMISSION_EXTERNAL = {Manifest.permission.WRITE_EXTERNAL_STORAGE, 
     Manifest.permission.READ_EXTERNAL_STORAGE}; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

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

     if (ActivityCompat.shouldShowRequestPermissionRationale(this, 
       Manifest.permission.CAMERA)) { 
      // 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 { 
      ActivityCompat.requestPermissions(MainActivity.this, 
        new String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA); 
     } 
    } else if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) 
      != PackageManager.PERMISSION_GRANTED 
      || ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) 
      != PackageManager.PERMISSION_GRANTED) { 
     if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) 
       || ActivityCompat.shouldShowRequestPermissionRationale(this, 
       Manifest.permission.READ_EXTERNAL_STORAGE)) { 
      // 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 { 
      ActivityCompat.requestPermissions(MainActivity.this, 
        PERMISSION_EXTERNAL, REQUEST_EXTERNAL_STORAGE); 
     } 
    } 

    setContentView(R.layout.activity_main); 
    toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    nvDrawer = (NavigationView) findViewById(R.id.nvView); 
    mDrawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    setupDrawerContent(nvDrawer); 
    drawerToggle = setupDrawerToggle(); 
    mDrawer.addDrawerListener(drawerToggle); 
} 

@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
    if (requestCode == REQUEST_CAMERA) { 
     if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
      //granted 
     } else { 
      ActivityCompat.requestPermissions(MainActivity.this, 
        new String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA); 
     } 
    } else if (requestCode != REQUEST_EXTERNAL_STORAGE) { 
     if (PermissionUtil.verifyPermission(grantResults)) { 
      //Has been granted 
     } else { 
      //Not granted for permission 
     } 
    } else { 
     super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    } 
} 

private ActionBarDrawerToggle setupDrawerToggle() { 
    return new ActionBarDrawerToggle(this, mDrawer, toolbar, R.string.drawer_open, R.string.drawer_close); 
} 

private void setupDrawerContent(NavigationView navigationView) { 
    navigationView.setNavigationItemSelectedListener(
      new NavigationView.OnNavigationItemSelectedListener() { 
       @Override 
       public boolean onNavigationItemSelected(MenuItem menuItem) { 
        selectDrawerItem(menuItem); 
        return true; 
       } 
      }); 
} 

private void selectDrawerItem(MenuItem menuItem) { 
} 

@Override 
protected void onPostCreate(Bundle savedInstanceState) { 
    super.onPostCreate(savedInstanceState); 
    drawerToggle.syncState(); 
} 

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    drawerToggle.onConfigurationChanged(newConfig); 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    if (drawerToggle.onOptionsItemSelected(item)) { 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 

}检查Android上的多个权限READ

utils的类和写入外部准许

public abstract class PermissionUtil { 

public static boolean verifyPermission(int[] grantResults){ 
    // At least one result must be checked. 
    if (grantResults.length > 0){ 
     return false; 
    } 

    for (int results :grantResults){ 
     if (results != PackageManager.PERMISSION_GRANTED){ 
      return false; 
     } 
    } 
    return true; 
} 

}

即使我已经为所有的清单提供许可。

回答

-1

您可以将多个权限添加到列表中。

检查多个权限

public static final int REQUEST_ID_MULTIPLE_PERMISSIONS = 101; 

public static boolean checkAndRequestPermissions(final Activity context) { 
    int ExtstorePermission = ContextCompat.checkSelfPermission(context, 
      Manifest.permission.READ_EXTERNAL_STORAGE); 
    int cameraPermission = ContextCompat.checkSelfPermission(context, 
      Manifest.permission.CAMERA); 
    List<String> listPermissionsNeeded = new ArrayList<>(); 
    if (cameraPermission != PackageManager.PERMISSION_GRANTED) { 
     listPermissionsNeeded.add(Manifest.permission.CAMERA); 
    } 
    if (WExtstorePermission != PackageManager.PERMISSION_GRANTED) { 
     listPermissionsNeeded 
       .add(Manifest.permission.WRITE_EXTERNAL_STORAGE); 
    } 
    if (!listPermissionsNeeded.isEmpty()) { 
     ActivityCompat.requestPermissions(context, listPermissionsNeeded 
       .toArray(new String[listPermissionsNeeded.size()]), 
       REQUEST_ID_MULTIPLE_PERMISSIONS); 
     return false; 
    } 
    return true; 
} 

使用它像

方法,

if(checkAndRequestPermissions(MainActivity.this)){ 
    doWork(); 
} 

和处理PermissionsResult一样,

@Override 
public void onRequestPermissionsResult(int requestCode,String[] permissions, int[] grantResults) { 
    switch (requestCode) { 
     case Utility.REQUEST_ID_MULTIPLE_PERMISSIONS: 
      if (ContextCompat.checkSelfPermission(MainActivity.this, 
        Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { 
       Toast.makeText(getApplicationContext(), 
         "FlagUp Requires Access to Camara.", Toast.LENGTH_SHORT) 
         .show(); 
       finish(); 
      } else if (ContextCompat.checkSelfPermission(Splash_Activity.this, 
        Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { 
       Toast.makeText(getApplicationContext(), 
         "FlagUp Requires Access to Your Storage.", 
         Toast.LENGTH_SHORT).show(); 
       finish(); 
      } else { 
       doWork(); 
      } 
      break; 
    } 
} 

编码快乐..

+0

你为什么要通过最后一个活动上下文方法 –

+0

@MerkyRobins因为活动的语境中一些代码行的必选。我在方法中传递了上下文,因为我在不同的类中使用了这种方法。如果你想在同一个类中使用这个方法,不需要传递上下文。 –

+0

什么是实用工具? @ V-rundPuro-hit – Tigris

0

试试这个,

public static final int REQUEST_STORAGE = 101; 

    String[] PERMISSIONS = {android.Manifest.permission.WRITE_EXTERNAL_STORAGE, android.Manifest.permission.CAMERA}; 
    if (Build.VERSION.SDK_INT >= 23) { 
    if (!hasPermissions(mContext, PERMISSIONS)) { 
     ActivityCompat.requestPermissions((Activity) mContext, PERMISSIONS, REQUEST_STORAGE); 
    } else { 
     // TODo 
    } 
    } 



    /*check permissions for marshmallow*/ 
    @SuppressWarnings("BooleanMethodIsAlwaysInverted") 
    private static boolean hasPermissions(Context context, String... permissions) { 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && context != null && permissions != null) { 
      for (String permission : permissions) { 
       if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) { 
        return false; 
       } 
      } 
     } 
     return true; 
    } 

    /*get Permissions Result*/ 
    @Override 
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
     super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
     switch (requestCode) { 
      case REQUEST_STORAGE: { 
       if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
        Log.d("TAG", "PERMISSION_GRANTED"); 
        writeFile(); 
       } else { 
        Toast.makeText(mContext, "The app was not allowed to write to your storage", Toast.LENGTH_LONG).show(); 
       } 
      } 

     } 
    } 
0
private static final int PERMISSION_STORAGE = 1; 

    if (Utils.checkForPermission(getActivity(), 
    Manifest.permission.WRITE_EXTERNAL_STORAGE) && 
    Utils.checkForPermission(getActivity(), Manifest.permission.CAMERA)) { 
     //do your work.. 
    }else { 
         requestPermissions(new String[]{AUDIO_PERMISSION, MIC_PERMISSION}, PERMISSION_STORAGE); 
        } 


     @TargetApi(Build.VERSION_CODES.M) 
     private void requestForPermissions(String permssion, int permissionCode) { 
      if (shouldShowRequestPermissionRationale(permssion)) { 
       requestPermissions(new String[]{permssion}, permissionCode); 
      } else { 
       requestPermissions(new String[]{permssion}, permissionCode); 
      } 
     } 

    @Override 
     public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
      super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
      switch (requestCode) { 
       case PERMISSION_STORAGE: 
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED) { 
    // do your work.. 
    }else{ 
    // show message that permission required. 
    }