来自应用程序的运行时权限

时间:2020-02-27 08:59:24

标签: android android-studio android-application-class

我想从应用程序类寻求许可。如何请求访问设备ID的权限?我无法从活动中请求许可,因为它在启动初始屏幕活动之前崩溃了。 以下代码是启动屏幕活动的一部分。

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

检查权限的代码

public  void checkpermi() {    
if(ContextCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION)
            + ContextCompat.checkSelfPermission(
            this,Manifest.permission.READ_PHONE_STATE)
            + ContextCompat.checkSelfPermission(
            this,Manifest.permission.WRITE_EXTERNAL_STORAGE)
            != PackageManager.PERMISSION_GRANTED){

        // Do something, when permissions not granted
        if(ActivityCompat.shouldShowRequestPermissionRationale(
                this,Manifest.permission.ACCESS_FINE_LOCATION)
                || ActivityCompat.shouldShowRequestPermissionRationale(
                this,Manifest.permission.READ_PHONE_STATE)
                || ActivityCompat.shouldShowRequestPermissionRationale(
                this,Manifest.permission.WRITE_EXTERNAL_STORAGE)){
            // If we should give explanation of requested permissions

            // Show an alert dialog here with request explanation
            AlertDialog.Builder builder = new AlertDialog.Builder(SplashScreenActivity.this);
            builder.setMessage("Location, Read Contacts and Write External" +
                    " Storage permissions are required to do the task.");
            builder.setTitle("Please grant those permissions");
            builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    ActivityCompat.requestPermissions(
                            SplashScreenActivity.this,
                            new String[]{
                                    Manifest.permission.ACCESS_FINE_LOCATION,
                                    Manifest.permission.READ_PHONE_STATE,
                                    Manifest.permission.WRITE_EXTERNAL_STORAGE
                            },

                            STORAGE_PERMISSION_CODE
                    );
                }
            });
            builder.setNeutralButton("Cancel",null);
            AlertDialog dialog = builder.create();
            dialog.show();
        }else{
            // Directly request for required permissions, without explanation
            ActivityCompat.requestPermissions(
                    this,
                    new String[]{
                            Manifest.permission.ACCESS_FINE_LOCATION,
                            Manifest.permission.READ_PHONE_STATE,
                            Manifest.permission.WRITE_EXTERNAL_STORAGE
                    },
                    STORAGE_PERMISSION_CODE
            );
        }
    }else {
        // Do something, when permissions are already granted
        Toast.makeText(SplashScreenActivity.this,"Permissions already granted",Toast.LENGTH_SHORT).show();
    }
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

    //Checking the request code of our request
    if(requestCode == STORAGE_PERMISSION_CODE){

        //If permission is granted
        if(grantResults.length >0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){

            //Displaying a toast
            Toast.makeText(this,"Permission granted now you can read the storage",Toast.LENGTH_LONG).show();
        }else{
            //Displaying another toast if permission is not granted
            Toast.makeText(this,"Oops you just denied the permission",Toast.LENGTH_LONG).show();
        }
    }
}

但不是打开启动屏幕活动,而是使用Collect.java应用程序类的on create方法覆盖on create方法,并且代码是。

@Override
public void onCreate() {
    singleton = this;

    super.onCreate();

    PropertyManager mgr = new PropertyManager(this);


    mActivityLogger = new ActivityLogger(

            mgr.getSingularProperty(PropertyManager.DEVICE_ID_PROPERTY));
}

如果由于应用内的大多数按钮无法使用而无法删除上述代码。

错误日志是。

2020-02-27 16:36:12.159 31359-31359 / com.gic.spade.android E / AndroidRuntime:FATAL EXCEPTION:main 流程:com.gic.spade.android,PID:31359 java.lang.RuntimeException:无法创建应用程序com.gic.spade.android.application.Collect:java.lang.SecurityException:getDeviceId:用户10366和当前进程都没有android.permission.READ_PHONE_STATE。 在android.app.ActivityThread.handleBindApplication(ActivityThread.java:6065) 在android.app.ActivityThread.-wrap1(未知来源:0) 在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1764) 在android.os.Handler.dispatchMessage(Handler.java:105) 在android.os.Looper.loop(Looper.java:164) 在android.app.ActivityThread.main(ActivityThread.java:6944) 在java.lang.reflect.Method.invoke(本机方法) 在com.android.internal.os.Zygote $ MethodAndArgsCaller.run(Zygote.java:327) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374) 由以下原因引起:java.lang.SecurityException:getDeviceId:用户10366和当前进程都没有android.permission.READ_PHONE_STATE。 在android.os.Parcel.readException(Parcel.java:1959) 在android.os.Parcel.readException(Parcel.java:1905) 在com.android.internal.telephony.ITelephony $ Stub $ Proxy.getDeviceId(ITelephony.java:5333) 在android.telephony.TelephonyManager.getDeviceId(TelephonyManager.java:1069) 在com.gic.spade.android.logic.PropertyManager。(PropertyManager.java:135) 在com.gic.spade.android.application.Collect.onCreate(Collect.java:260) 在android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1125) 在android.app.ActivityThread.handleBindApplication(ActivityThread.java:6062) 在android.app.ActivityThread.-wrap1(未知来源:0) 在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1764) 在android.os.Handler.dispatchMessage(Handler.java:105) 在android.os.Looper.loop(Looper.java:164) 在android.app.ActivityThread.main(ActivityThread.java:6944) 在java.lang.reflect.Method.invoke(本机方法) 在com.android.internal.os.Zygote $ MethodAndArgsCaller.run(Zygote.java:327) com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)

1 个答案:

答案 0 :(得分:0)

如果您需要一个权限,甚至可以请求该权限,也许您应该得出结论,认为您的代码没有很好的体系结构。

只需跳过该代码,直到在授予权限后重新启动它即可。

在您的问题中,您似乎想在创建应用程序时发送设备ID。除非您有权获得它,否则请不要发送它。

if (checkPermission(...) == GRANTED) {
    PropertyManager mgr = new PropertyManager(this);
    mActivityLogger = new ActivityLogger(mgr.getSingularProperty(PropertyManager.DEVICE_ID_PROPERTY));
} else {
    mActivityLogger = new ActivityLogger();
    // Or even disable that logger altogether
}
相关问题