在 RecyclerView 适配器中询问权限 Class - onRequestPermissionsResult 未调用

Asking Permission in RecyclerView Adapter Class - onRequestPermissionsResult not called

我想做什么:我想用列表中的 phone 号码打开拨号器。

问题是什么: 在触发 Intent.ACTION_CALL 意图之前,我需要征求许可,似乎 onRequestPermissionsResult 没有被调用。

我尝试了什么:下面是我的代码。

ApplicantsDataAdapter.java

    public class ApplicantsDataAdapter extends RecyclerView.Adapter<ApplicantsDataAdapter.ApplicantsViewHolder>
        implements
        ActivityCompat.OnRequestPermissionsResultCallback {

    private static final int REQUEST_CODE = 100;

    private Context mContext;
    private String mMobileNum;

    private List<DashboardStatusBean> mDataList;
    private OnApplicantItemClickListener mListener;

    public ApplicantsDataAdapter(Context context, List<DashboardStatusBean> dataList, OnApplicantItemClickListener listener) {
        mListener = listener;
        mContext = context;
        mDataList = dataList;
    }

    @Override
    public ApplicantsViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.item_applicant_new, parent, false);
        return new ApplicantsViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(ApplicantsViewHolder holder, int position) {
        holder.bindView(position);
        holder.mCardView.setOnClickListener(v -> mListener.onApplicantSelected(position));
    }

    @Override
    public int getItemCount() {
        return mDataList.size();
    }

    public interface OnApplicantItemClickListener {
        void onApplicantSelected(int position);
    }

    public class ApplicantsViewHolder extends RecyclerView.ViewHolder {

        @BindView(R.id.cv_item)
        CardView mCardView;

        @BindView(R.id.tv_item_applicant_status)
        TextView mApplicantStatusTextView;

        @BindView(R.id.tv_item_applicant_mobile)
        TextView mApplicantMobileNumber;

        @BindView(R.id.iv_call)
        ImageView mCallImage;

        ApplicantsViewHolder(View itemView) {
            super(itemView);
            ButterKnife.bind(this, itemView);
        }

        void bindView(int position) {

            mApplicantStatusTextView.setText(mDataList.get(position).getStatus());
            mApplicantMobileNumber.setText(mDataList.get(position).getMobileNumber());

            mCallImage.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    mMobileNum = mDataList.get(position).getMobileNumber().substring(2);
                    Log.e("click", "mob: " + mMobileNum);

                    phoneIntent();
                }
            });
        }
    }

    private void phoneIntent() {

        Intent callIntent = new Intent(Intent.ACTION_CALL);
        callIntent.setData(Uri.parse("tel:" + mMobileNum));

        if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {

            requestPermissions((AppCompatActivity) mContext,
                    new String[]{Manifest.permission.CALL_PHONE}, REQUEST_CODE);

            return;
        }

        mContext.startActivity(callIntent);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

        Log.e("click", "onRequestPermissionsResult");

        switch (requestCode) {

            case REQUEST_CODE:

                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                    Log.e("click", "PERMISSION_GRANTED");

                    phoneIntent();

                } else {

                    Log.e("click", "NOT PERMISSION_GRANTED");

                    Toast.makeText(mContext, "Call Permission Not Granted!", Toast.LENGTH_SHORT).show();
                }

                break;
        }
    }
}

PS: 我检查了三遍我在清单文件中添加了权限<uses-permission android:name="android.permission.CALL_PHONE" />

我们将不胜感激。

我认为 phone 调用不需要任何运行时权限

您只需要像下面这样在 Manifest 上指定权限

  <uses-permission android:name="android.permission.CALL_PHONE" />

并且在代码中,需要写这行代码才能打开任意号码付费拨号

 String mMobileNum = mDataList.get(position).getMobileNumber().substring(2);
 Log.e("click", "mob: " + mMobileNum);

 startActivity(new Intent(Intent.ACTION_DIAL, Uri.parse("tel:" +mMobileNum)));