android调用运行时权限与对话框

时间:2017-03-05 16:00:07

标签: android android-6.0-marshmallow android-permissions runtime-permissions

我有应用程序请求运行时权限,以便在应用程序启动时调用对话框,但不知怎的,我的代码不会请求任何权限或工作。应用程序启动时我需要它;询问用户是否允许呼叫,如果用户拒绝,请再次询问权限并转到权限设置。

这是我的代码:

public class MainActivity extends AppCompatActivity {
private FirebaseAnalytics mFirebaseAnalytics;
private AdView mAdView;

private Button button_id;
private Button button_mobily;
private Button button_stc;
private Button button_zain;
private Button button_share;
private Button button_exit;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.dash);
    NativeExpressAdView adView = (NativeExpressAdView)findViewById(R.id.adView);

    AdRequest request = new AdRequest.Builder().build();
    adView.loadAd(request);

    mFirebaseAnalytics = FirebaseAnalytics.getInstance(this);
    Bundle bundle = new Bundle();
    bundle.putString(FirebaseAnalytics.Param.ITEM_ID, "main");
    bundle.putString(FirebaseAnalytics.Param.ITEM_NAME, "opened");
    bundle.putString(FirebaseAnalytics.Param.CONTENT_TYPE, "image");
    mFirebaseAnalytics.logEvent(FirebaseAnalytics.Event.SELECT_CONTENT, bundle);

    isPermissionGranted();



    button_exit = (Button) findViewById(R.id.exit_buton_id);
    button_share = (Button) findViewById(R.id.Share_buton);
    button_id = (Button) findViewById(R.id.edit_id);
    button_mobily = (Button) findViewById(R.id.mobily_buton);
    button_stc = (Button) findViewById(R.id.stc_buton);
    button_zain = (Button) findViewById(R.id.zain_buton);


    button_id.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            Intent myIntent = new Intent(MainActivity.this, NationalId.class);
            MainActivity.this.startActivity(myIntent);

        }
    });


    button_share.setOnClickListener(new View.OnClickListener() {

        public void onClick(View arg0) {
            try {
                Intent i = new Intent(Intent.ACTION_SEND);
                i.setType("text/plain");
                i.putExtra(Intent.EXTRA_SUBJECT, "test");
                String sAux = "\n download my app\n\n";
                sAux = sAux + "https://play.google.com/store/apps/details?id=Orion.Soft \n\n";
                i.putExtra(Intent.EXTRA_TEXT, sAux);
                startActivity(Intent.createChooser(i, "share on"));
            } catch (Exception e) {
                //e.toString();
            }

        }
    });

    button_exit.setOnClickListener(new View.OnClickListener() {

        public void onClick(View arg0) {

            close();
        }
    });

    button_mobily.setOnClickListener(new View.OnClickListener() {

        public void onClick(View arg0) {
            Intent myIntent = new Intent(MainActivity.this, OpreatorMobily.class);
            MainActivity.this.startActivity(myIntent);
        }
    });

    button_stc.setOnClickListener(new View.OnClickListener() {

        public void onClick(View arg0) {
            Intent myIntent = new Intent(MainActivity.this, OpreatorSTC.class);
            MainActivity.this.startActivity(myIntent);
        }
    });

    button_zain.setOnClickListener(new View.OnClickListener() {

        public void onClick(View arg0) {
            Intent myIntent = new Intent(MainActivity.this, OpreatorZain.class);
            MainActivity.this.startActivity(myIntent);
        }
    });

}

public boolean isPermissionGranted() {
    if (Build.VERSION.SDK_INT >= 23) {
        if (checkSelfPermission(android.Manifest.permission.CALL_PHONE)
                == PackageManager.PERMISSION_GRANTED) {
            Log.v("TAG", "Permission is granted");
            return true;
        } else {

            Log.v("TAG", "Permission is revoked");
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CALL_PHONE}, 1);
            return false;
        }
    } else { //permission is automatically granted on sdk<23 upon installation
        Log.v("TAG", "Permission is granted");
        return true;
    }
}

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

        case 1: {

            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                Toast.makeText(getApplicationContext(), "Permission granted", Toast.LENGTH_SHORT).show();

            } else {
                Toast.makeText(getApplicationContext(), "Permission denied", Toast.LENGTH_SHORT).show();
            }
            return;
        }

        // other 'case' lines to check for other
        // permissions this app might request
    }
}


public void close() {
    // TODO Auto-generated method stub
    finish();
    System.exit(0);
}


}

2 个答案:

答案 0 :(得分:0)

您不需要检查Android版本,Android足够聪明,可以知道用户设备上的操作系统版本。

此外,如果您尝试调用此功能,则需要更改权限的调用方式。

public boolean isPermissionGranted() {
Intent callOfficeIntent = new Intent(Intent.ACTION_CALL);
callOfficeIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
callOfficeIntent.setData(Uri.parse("tel:" + mNumberToCall));
if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.CALL_PHONE},
                        10);
                return;
            } else {
                try {
                    startActivity(callOfficeIntent);
                } catch (ActivityNotFoundException e) {
                    Toast.makeText(getApplicationContext(), "No number to call", Toast.LENGTH_SHORT).show();
                }
            }
}

如果您只是想获得权限但不立即拨打电话,请将其放入您的方法中。这只是要求允许作为DialogBox。

if(ActivityCompat.checkSelfPermission(getActivity(),Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED){
                   if(ActivityCompat.shouldShowRequestPermissionRationale(getActivity(),Manifest.permission.READ_PHONE_STATE)){
                       //Show Information about why you need the permission
                       AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
                       builder.setTitle("Need Permission");
                       builder.setMessage("This app needs phone permission.");
                       builder.setPositiveButton("Grant", new DialogInterface.OnClickListener() {
                           @Override
                           public void onClick(DialogInterface dialog, int which) {
                               dialog.cancel();
                               requestPermissions(new String[]{Manifest.permission.READ_PHONE_STATE},PERMISSION_CALLBACK_CONSTANT);
                           }
                       });
                       builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                           @Override
                           public void onClick(DialogInterface dialog, int which) {
                               dialog.cancel();
                           }
                       });
                       builder.show();
                   } else if (permissionStatus.getBoolean(Manifest.permission.READ_PHONE_STATE,false)) {
                       //Previously Permission Request was cancelled with 'Dont Ask Again',
                       // Redirect to Settings after showing Information about why you need the permission
                       AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
                       builder.setTitle("Need Permission");
                       builder.setMessage("This app needs storage permission.");
                       builder.setPositiveButton("Grant", new DialogInterface.OnClickListener() {
                           @Override
                           public void onClick(DialogInterface dialog, int which) {
                               dialog.cancel();
                               sentToSettings = true;
                               Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                               Uri uri = Uri.fromParts("package", getActivity().getPackageName(), null);
                               intent.setData(uri);
                               startActivityForResult(intent, REQUEST_PERMISSION_SETTING);
                               Toast.makeText(getActivity(), "Go to Permissions to Grant Phone", Toast.LENGTH_LONG).show();
                           }
                       });
                       builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                           @Override
                           public void onClick(DialogInterface dialog, int which) {
                               dialog.cancel();
                           }
                       });
                       builder.show();
                   }  else {
                       //just request the permission
                       requestPermissions(new String[]{Manifest.permission.READ_PHONE_STATE},PERMISSION_CALLBACK_CONSTANT);
                   }
                   txtPermissions.setText("Permissions Required");


                   SharedPreferences.Editor editor = permissionStatus.edit();
                   editor.putBoolean(Manifest.permission.READ_PHONE_STATE,true);
                   editor.commit();
               } else {
                   //You already have the permission, just go ahead.
                   proceedAfterPermission();
               }
           }
       });
   }

private void proceedAfterPermission() {
       txtPermissions.setText("We've got the permission");
       Toast.makeText(getActivity(), "We got All Permissions", Toast.LENGTH_LONG).show();
   }

不必使用最后一种方法,只需将textView更改为toast。

答案 1 :(得分:0)

我找到了一个由“ Nabin Bhandari”开发的简单的Github库。它易于实施,可以直接定制。 Github library link...

请添加此依赖项以将此库添加到您的代码中。

实现'com.nabinbhandari.android:permissions:3.8'

这允许您请求单个权限,多个权限并自定义自己的对话框。

此外,

  • 如果要更改默认行为,还可以覆盖其他方法,例如onDenied,onJustBlocked等。
  • 对话消息和文本可以通过构建options参数来修改。
  • 有关更多自定义内容,请参见源代码中的文档。

使用此代码可以同时询问多个权限。

String[] permissions = {Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE};
Permissions.check(this/*context*/, permissions, null/*rationale*/, null/*options*/, new PermissionHandler() {
    @Override
    public void onGranted() {
        // do your task.
    }
});

如果要自定义权限请求,请使用此代码:

String[] permissions = {Manifest.permission.ACCESS_FINE_LOCATION};
String rationale = "Please provide location permission so that you can ...";
Permissions.Options options = new Permissions.Options()
        .setRationaleDialogTitle("Info")
        .setSettingsDialogTitle("Warning");

Permissions.check(this/*context*/, permissions, rationale, options, new PermissionHandler() {
    @Override
    public void onGranted() {
        // do your task.
    }

    @Override
    public void onDenied(Context context, ArrayList<String> deniedPermissions) {
        // permission denied, block the feature.
    }
});