2

What I want to do: I want open dialer with phone number which is in a list.

What is the issue: Before firing Intent.ACTION_CALL intent, I need to ask permission, it seems onRequestPermissionsResult is not getting called.

What I tried: Below is my code.

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: I checked three times that I added permission <uses-permission android:name="android.permission.CALL_PHONE" /> in Manifest file.

Any help will be appreciated.

Maulik Dodia
  • 1,629
  • 2
  • 21
  • 48
  • ask the permission in oncreate() of your fragment/activity class then override onRequestPermissionsResult in that class – Quick learner Sep 11 '18 at 05:40
  • https://stackoverflow.com/questions/32714787/android-m-permissions-onrequestpermissionsresult-not-being-called – AskNilesh Sep 11 '18 at 05:41

1 Answers1

2

I think it does not require any runtime permission for the phone call

You need to specify the permission on the Manifest only like below

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

And in the code, you need to write this lines of code to open the dialer paid for calling any number.

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

 startActivity(new Intent(Intent.ACTION_DIAL, Uri.parse("tel:" +mMobileNum)));
Ravindra Kushwaha
  • 7,846
  • 14
  • 53
  • 103