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

Java 每当我第一次启动应用程序时,应用程序崩溃,然后它向我请求用户权限,java,android,permissions,call,Java,Android,Permissions,Call,我的Android应用程序在第一次启动时崩溃,它询问我有关用户呼叫权限的问题。当我再次启动我的应用程序时,它会正常工作。我尝试了以下代码 public void loadContactList() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && checkSelfPermission(Manifest.permission.READ_CONTACTS) != PackageManager.PERMIS

我的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();
        }
    }
}

添加以下代码

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;
    }
public boolean checkAndRequestPermissions(){
List ListPermissionsNeed=new ArrayList();
for(字符串perm:appPermissions){
if(ContextCompat.checkSelfPermission(this,perm)!=PackageManager.PERMISSION\u已授予){
ListPermissionsNeed.add(perm);
}
}
如果(!ListPermissionsNeed.isEmpty()){
ActivityCompat.requestPermissions(此,ListPermissionsNeed.toArray(新字符串[ListPermissionsNeed.size()]),权限\请求\代码);
返回false;
}
返回true;
}

您的代码是正确的,但您将代码设置在了错误的位置。让我们试试这个,它肯定会对您有所帮助

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()


这对你有用,因为当我陷入同样的困境时,它对我有用。我刚刚解决了一个异常。我做了两件事。首先,我通过

loadContactList()
中的
Contacts=new ArrayList
并将其添加到
onCreate()
中,然后我刚刚将
loadContactList()的返回数据类型从void更改为list。然后我在loadContacts()中返回了联系人,以便
loadListView()
可以获取此列表并将其显示到列表视图中。

请不要发布代码、XML或logcat输出的屏幕截图。请以文本形式发布所有文本。好的,我正在更新它。除非您不允许调用权限,否则不要调用您的方法loadContactList(),它在哪一行崩溃?正确添加您的代码,并从logcat发布崩溃的stacktrace。可能重复的Nope仍然是第一次启动它正在崩溃并询问我的用户权限,然后第二次启动它从身份验证页面开始正常工作。您可以复制粘贴logcat中显示的错误吗?原因是:java.lang.NullPointerException:尝试在com.example.jimitt.elderlycomboclient.MainActivity.loadListView上的android.widget.ArrayAdapter.getCount(ArrayAdapter.java:380)上的空对象引用上调用接口方法“int java.util.List.size()”(MainActivity.java:214)位于com.example.jimitt.elderlycomboclient.MainActivity.onCreate(MainActivity.java:80)ArrayAdapter=new ArrayAdapter(此,R.layout.lv_项,联系人)lv.setAdapter(适配器);当列表在第80行中为空时,您正试图获取列表的大小。请在调用它之前检查是否为空。