【问题标题】:Whenever I launch the app for the first time the app crashes and then it asks me the user permission每当我第一次启动应用程序时,应用程序崩溃,然后它会询问我用户权限
【发布时间】:2019-01-22 05:17:55
【问题描述】:

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

【问题讨论】:

  • 请不要发布代码、XML 或 logcat 输出的屏幕截图。请将所有文本作为文本发布。
  • 好的,我正在更新它。
  • 除非你不允许调用权限,否则不要调用你的方法loadContactList()
  • 崩溃在哪一行?正确添加您的代码,并从 logcat 发布崩溃的堆栈跟踪。

标签: java android permissions call


【解决方案1】:

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

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

它对你有用,因为当我陷入同样的​​情况时它对我有用

【讨论】:

    【解决方案2】:

    添加以下代码

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

    在创建时调用此方法

    checkAndRequestPermissions();
    

    将以下方法添加到您的 Main Activity

    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;
        }
    

    【讨论】:

    • 不,第一次启动它崩溃并询问我用户许可,然后第二次启动它从身份验证页面开始正常工作。
    • 能否请您复制粘贴logcat中显示的错误
    • 引起:java.lang.NullPointerException:尝试在 android.widget.ArrayAdapter.getCount(ArrayAdapter. java:380) 在 com.example.jimitt.elderlycomboclient.MainActivity.loadListView(MainActivity.java:214) 在 com.example.jimitt.elderlycomboclient.MainActivity.onCreate 的 android.widget.ListView.setAdapter(ListView.java:575) (MainActivity.java:80)
    • ArrayAdapter adapter = new ArrayAdapter(this, R.layout.lv_item, contacts) lv.setAdapter(adapter);
    • 您正在尝试获取第 80 行中为空的列表的大小。在调用它之前检查是否为空。
    【解决方案3】:

    我刚刚解决了一个异常。我做了两件事。首先,我从loadContactList() 中删除了Contacts by
    Contacts = new ArrayList&lt;ContactModel&gt; 的初始化并将其添加到onCreate() 中,其次我只是将loadContactList() 的返回数据类型从void 更改为list。然后我在 loadContacts() 中返回了联系人,以便loadListView() 可以获取此列表并将其显示到列表视图中。

    【讨论】:

      猜你喜欢
      • 2019-11-05
      • 2012-07-16
      • 1970-01-01
      • 2011-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多