向ViewHolder请求电话呼叫权限



我的应用程序有一个RecyclerView,里面有一个餐馆列表,每个餐馆都有一个打电话的按钮。

该电话呼叫适用于除23个API之外的所有API。问题是应用程序必须请求权限才能拨打电话,但它不能从非活动类中这样做。

我试着传递上下文,但对我不起作用。

以下是将餐厅绑定到CardView的方法。

public void bind(final Restaurant restaurant) {
    name.setText(restaurant.getName());
    address.setText(restaurant.getAddress());
    city.setText(String.format("%05d %s (%s)", restaurant.getZip(), restaurant.getCity(), restaurant.getRegion()));
    switch (restaurant.getCountry()) {
        case "France":
            country.setText(R.string.france);
            break;
        case "Spain":
            country.setText(R.string.spain);
            break;
        case "Poland":
            country.setText(R.string.poland);
            break;
        case "Portugal":
            country.setText(R.string.portugal);
    }
    latitude = restaurant.getLatitude();
    longitude = restaurant.getLongitude();
    phoneCall.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:"+restaurant.getPhone()));
           //                
           // Here I should request the permissions
           // 
           v.getContext().startActivity(intent);
        }
    });
    navigation.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Uri gmmIntentUri = Uri.parse("google.navigation:q=" + latitude + "," + longitude);
            Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
            mapIntent.setPackage("com.google.android.apps.maps");
            v.getContext().startActivity(mapIntent);
        }
    });
}

有什么解决方案吗?提前感谢

您应该创建一个界面,并将phoneCall点击事件发送到您的"活动",然后您可以从那里请求权限。

样本代码

public class RecyclerAdapter extends RecyclerView.ViewHolder{
    private OnPhoneCallListener listener;
    public void setListener(OnPhoneCallListener listener){
        this.listener = listener;
    }
    public void bind(final Restaurant restaurant) {
          ..........
          ..........
          ..........
        phoneCall.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(listener != null){
                    listener.onPhoneCallClick(restaurant.getPhone());
                }
            }
        });
          ..........
          ..........
          ..........
    }
    public interface OnPhoneCallListener{
        void onPhoneCallClick(String phoneNumber);
    }
}

来自活动类

// Register for callback event.
RecyclerAdater.setListener(new OnPhoneCallListener(){
    @Override
    public void onPhoneCallClick(String phoneNumber){
        //This portion will get execute when user will click on call button.
        // Now here you can check for the permission, if it is granted,
        // you can fire `ACTION_CALL` intent.
    }
});

最新更新