有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java每当我第一次启动应用程序时,应用程序崩溃,然后它向我请求用户权限

我的Android应用程序在第一次启动时崩溃,它询问我有关用户呼叫权限的问题。当我再次启动我的应用程序时,它会正常工作。我尝试了以下代码

public void loadContactList() {

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && checkSelfPermission(Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
        requestPermissions(new String[]{Manifest.permission.READ_CONTACTS}, PERMISSIONS_REQUEST_READ_CONTACTS);
    } else {.....}
}

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions,int[] grantResults) {
    if (requestCode == PERMISSIONS_REQUEST_READ_CONTACTS) {
        if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            loadContactList();
        } else {
            Toast.makeText(this, "Until you grant the permission, we canot display the list", Toast.LENGTH_SHORT).show();
        }
    }
}

共 (3) 个答案

  1. # 1 楼答案

    添加以下代码

    String[] appPermissions =
                {Manifest.permission.READ_CONTACTS,
                        Manifest.permission.WRITE_CONTACTS};
        int PERMISSIONS_REQUEST_CODE = 234;
    

    在创建时从您的应用程序调用此方法

    checkAndRequestPermissions();
    

    将以下方法添加到主要活动中

    public boolean checkAndRequestPermissions() {
            List<String> listPermissionsNeeded = new ArrayList<>();
            for (String perm : appPermissions) {
                if (ContextCompat.checkSelfPermission(this, perm) != PackageManager.PERMISSION_GRANTED) {
                    listPermissionsNeeded.add(perm);
                }
            }
            if (!listPermissionsNeeded.isEmpty()) {
                ActivityCompat.requestPermissions(this, listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]), PERMISSIONS_REQUEST_CODE);
                return false;
            }
            return true;
        }
    
  2. # 2 楼答案

    我刚刚解决了一个例外。我做了两件事。首先,我通过
    删除了联系人的初始化 ^从loadContactList()中{}并将其添加到onCreate()中,然后我刚刚将loadContactList()的返回数据类型从void更改为list。然后我在loadContacts()中返回了联系人,以便loadListView()可以获取此列表并将其显示在列表视图中

  3. # 3 楼答案

    你的代码是对的,但是你把代码设置在了错误的地方,让我们试试这个,它肯定会帮你

    In Your Main Activity...
    
    private int STORAGE_PERMISSION_CODE = 1;
    
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        if (ContextCompat.checkSelfPermission(MainActivity.this,
                Manifest.permission.WRITE_EXTERNAL_STORAGE) == 
      PackageManager.PERMISSION_GRANTED) {
            filter();
            Toast.makeText(this, ""+arrayList, Toast.LENGTH_SHORT).show();
        } else {
            Permission.requestStoragePermission(MainActivity.this,
                      STORAGE_PERMISSION_CODE);
        }
    
    }//on create closed
    

    权限方法

    //                -RuntimePermission              -//
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] 
        permissions, @NonNull int[] grantResults) {
        if (requestCode == STORAGE_PERMISSION_CODE)  {
            if (grantResults.length > 0 && grantResults[0] == 
         PackageManager.PERMISSION_GRANTED) {
                filter();
            } else {
                Toast.makeText(this, "Permission DENIED", Toast.LENGTH_SHORT).show();
    
    Permission.requestStoragePermission(MainActivity.this,STORAGE_PERMISSION_CODE);
            }
        }
    }
    

    之后,让java类获得权限

    public class Permission {
    public static void requestStoragePermission(final Activity activity, final int 
           STORAGE_PERMISSION_CODE) {
        if (ActivityCompat.shouldShowRequestPermissionRationale(activity,
                Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
            new AlertDialog.Builder(activity)
                    .setTitle("Permission needed")
                    .setMessage("This permission is needed because of this and that")
                    .setPositiveButton("ok", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            ActivityCompat.requestPermissions(activity,
                                    new String[] 
            {Manifest.permission.WRITE_EXTERNAL_STORAGE}, STORAGE_PERMISSION_CODE);
                        }
                    })
                    .setNegativeButton("cancel", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            dialog.dismiss();
                        }
                    })
                    .create().show();
        } else {
            ActivityCompat.requestPermissions(activity,
                    new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 
       STORAGE_PERMISSION_CODE);
        }
    }
    

    }

    你要记住的主要事情是把你的工作方法放在正确的地方,比如我的is filter()

    它对你有用,因为当我陷入同样的处境时,它对我有用