自定义适配器中的 Marshmallow 权限 class

Marshmallow permission in custom adapter class

尝试对 RecyclerView 项目点击进行 phone 调用时出现此异常...

FATAL EXCEPTION: main 
    Process: com.itec.kdaportal, PID: 11701
    java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.pm.PackageManager android.content.Context.getPackageManager()' on a null object reference
    at android.content.ContextWrapper.getPackageManager(ContextWrapper.java:97)
    at android.app.Activity.shouldShowRequestPermissionRationale(Activity.java:4229)
    at android.support.v4.app.ActivityCompatApi23.shouldShowRequestPermissionRationale(ActivityCompatApi23.java:50)
    at android.support.v4.app.ActivityCompat.shouldShowRequestPermissionRationale(ActivityCompat.java:419)
    at com.itec.kdaportal.Adapters.DirCustomAdapter$ViewHolder.onClick(DirCustomAdapter.java:65)
    at android.view.View.performClick(View.java:5716)
    at android.view.View$PerformClick.run(View.java:22596)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:148)
    at android.app.ActivityThread.main(ActivityThread.java:7331)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

我认为导致此异常的代码在这里...

// Provide a suitable constructor (depends on the kind of dataset)
public DirCustomAdapter(Context context, Activity activity, ArrayList<Directories> dir) {
    mContext = context;
    mActivity = activity;
    this.list = dir;
}

// Provide a reference to the views for each data item
// Complex data items may need more than one view per item, and
// you provide access to all the views for a data item in a view holder
public static class ViewHolder extends RecyclerView.ViewHolder {
    Directories dirObj;
    // each data item is just a string in this case
    public TextView org, contact;
    private int PHONE_PERMISSION_CODE = 03;

    public ViewHolder(View v) {
        super(v);
        org = (TextView) v.findViewById(R.id.tvOrganization);
        contact = (TextView) v.findViewById(R.id.tvContactNo);

        v.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(mContext, dirObj.getOrgName() + " clicked!", Toast.LENGTH_SHORT).show();
                phoneNo = dirObj.getContactNo();
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    if(ActivityCompat.checkSelfPermission(mContext, Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED){
                        mContext.startActivity(new Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + dirObj.getContactNo())));
                    }else{
                        if(ActivityCompat.shouldShowRequestPermissionRationale(mActivity, Manifest.permission.CALL_PHONE)){
                            Toast.makeText(mContext, "App requires Phone Call permission.\nPlease allow that in the device settings.", Toast.LENGTH_LONG).show();
                        }
                        ActivityCompat.requestPermissions(mActivity, new String[]{Manifest.permission.CALL_PHONE}, PHONE_PERMISSION_CODE);
                    }
                }else{
                    mContext.startActivity(new Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + dirObj.getContactNo())));
                }
            }
        });
    }
    public void bindData(Directories c){
        dirObj = c;
        org.setText(c.getOrgName());
        contact.setText(c.getContactNo());
    }
}

正在以这种方式创建 CustomAdapter 对象...

   dirAdapter = new DirCustomAdapter(this, new DirectoryActivity(), arrayList);
    mRecyclerView.setAdapter(dirAdapter);

应用程序在 Marshmallow 之前的设备上运行良好。

请帮助我修复它。

也请建议,有没有其他方法可以通过点击 RecyclerView item click 来请求 Marshmallow 权限?

感谢和问候

创建 Activity 的新对象 class 是错误的方法。

dirAdapter = new DirCustomAdapter(this, new DirectoryActivity(), arrayList); // HERE new DirectoryActivity() is incorrect way to pass Activity reference.
 mRecyclerView.setAdapter(dirAdapter);

使用下面的代码

dirAdapter = new DirCustomAdapter(this, DirectoryActivity.this, arrayList);
mRecyclerView.setAdapter(dirAdapter);

我假设您是从 DirectoryActivity.java Activity class.

调用上面的代码片段