【问题标题】:How to Implement Phone call permission granted method in android如何在android中实现电话呼叫权限授予方法
【发布时间】:2024-04-30 22:25:02
【问题描述】:

在我的应用程序中,我创建了一个名为 call_action 的方法,它支持运行时权限以允许用户拨打电话。我已经在片段类中实现了这个方法。现在在我的应用程序中,我已经在活动和片段中多次使用过这种方法。我知道以这种方式我必须在每个片段和活动中多次编写此代码。但是我想用这个方法创建一个类,通过它我可以在活动和片段中调用这个方法。因为我在 android 开发和软件开发方面都很陌生。我没有得到如何做到这一点的逻辑。这是我在 Fragments 中实现的代码

public class OptionMenuFragment extends Fragment implements View.OnClickListener{


private String phoneNumber, email;

public OptionMenuFragment() {
    // Required empty public constructor
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.option_main_fragment, container, false);

    Button myColleagues=(Button) view.findViewById(R.id.myColleagues);
    myColleagues.setOnClickListener(this);
    ......
    return view;

}

@Override
public void onClick(View view) {
    switch (view.getId()) {
        case R.id.myColleagues:
            Intent intent = new Intent(getActivity(), MyColleaguesPage.class);
            startActivity(intent);
            break;
        case R.id.news:
           ......
            break;
    }
}

private void showFirstDialog() {

    //Create a new builder and get the layout.
    final AlertDialog.Builder builder = new AlertDialog.Builder(this.getActivity());
   ......

    alertButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            alert.dismiss();
        }
    });

    alertListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                                int position, long id) {
            // ListView Clicked item index
            int itemPosition = position;

            if (itemPosition == 0) {
                alert.dismiss();
                showSecondDialog(0);
            }

           .......
            else if (itemPosition == 5) {
                alert.dismiss();
                showSecondDialog(5);
            }
        }
    });
}

private void showSecondDialog(int position) {

    alertTitle.setText("What do you want to do");
    // Defined Array values to show in ListView
    String[] values = getResources().getStringArray(R.array.contact_way);

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this.getActivity(),
            R.layout.first_alertlist_textstyle, android.R.id.text1, values);
    alertListView.setAdapter(adapter);

    alertButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            alert.dismiss();
        }
    });
    switch (position) {
        case 0:
            phoneNumber = "123456";
            email="mail.com";
            break;
       ......
        case 5:
            phoneNumber = "+1233";
            email="mail.com";

    }
    alertListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                                int position, long id) {
            // ListView Clicked item index
            int itemPosition = position;


            if (itemPosition == 0) {

                alert.dismiss();
                AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

                builder.setTitle("calling to " + phoneNumber);
                //builder.setMessage("Are you sure you want to log out?");

                builder.setPositiveButton("Call", new DialogInterface.OnClickListener() {

                    public void onClick(DialogInterface dialog, int which) {
                        // close the dialog, go to login page
                        if (isPermissionGranted()) {
                            call_action(); //here I am calling call method
                        }
                    }
                });
                builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        // Do nothing
                        dialog.dismiss();
                    }
                });

                AlertDialog alert = builder.create();
                alert.show();

            }
            if (itemPosition == 1) {
                ..

            }
            if (itemPosition == 2) {
             ....
}

//This code I want to implement into seperate class

 public void call_action(){

    Intent callIntent = new Intent(Intent.ACTION_CALL);
    callIntent.setData(Uri.parse("tel:" + phoneNumber));
    startActivity(callIntent);
 }
  public  boolean isPermissionGranted() {
    if (Build.VERSION.SDK_INT >= 23) {
        if (getActivity().checkSelfPermission(android.Manifest.permission.CALL_PHONE)
                == PackageManager.PERMISSION_GRANTED) {
            Log.v("TAG","Permission is granted");
            return true;
        } else {

            Log.v("TAG","Permission is revoked");
            ActivityCompat.requestPermissions(this.getActivity(), new String[]{Manifest.permission.CALL_PHONE}, 1);
            return false;
        }
    }
    else { //permission is automatically granted on sdk<23 upon installation
        Log.v("TAG","Permission is granted");
        return true;
    }
}

 @Override
 public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case 1: {
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                Toast.makeText(getActivity().getApplicationContext(), "Permission granted", Toast.LENGTH_SHORT).show();
                call_action();
            } else {
                Toast.makeText(getActivity().getApplicationContext(), "Permission denied", Toast.LENGTH_SHORT).show();
            }
            return;
        }

        // other 'case' lines to check for other
        // permissions this app might request
    }
}

}

【问题讨论】:

    标签: android android-fragments android-activity android-permissions user-permissions


    【解决方案1】:

    你可以这样做

    public class Permissions {
        private Context mContext;
        private Activity mActivity;
    
    
    
          public  Permissions(Context context, Activity mActivity){
    
                this.mContext=context;
                this.mActivity=mActivity;
            }
    
     public void call_action(){
    
        Intent callIntent = new Intent(Intent.ACTION_CALL);
        callIntent.setData(Uri.parse("tel:" + phoneNumber));
        mContext.startActivity(callIntent);
     }
    
        public  boolean isPermissionGranted() {
            if (Build.VERSION.SDK_INT >= 23) {
                if (ContextCompat.checkSelfPermission(mContext,android.Manifest.permission.CALL_PHONE)
                        == PackageManager.PERMISSION_GRANTED) {
                    Log.v("TAG","Permission is granted");
                    return true;
                } else {
    
                    Log.v("TAG","Permission is revoked");
                    mActivity.requestPermissions(new String[]{Manifest.permission.CALL_PHONE}, 1);
                    return false;
                }
            }
            else { //permission is automatically granted on sdk<23 upon installation
                Log.v("TAG","Permission is granted");
                return true;
            }
        }
    
        }
    

    并且您必须将此方法保留在您请求许可的活动或片段中

     @Override
     public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
        switch (requestCode) {
            case 1: {
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    Toast.makeText(getActivity().getApplicationContext(), "Permission granted", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(getActivity().getApplicationContext(), "Permission denied", Toast.LENGTH_SHORT).show();
                }
                return;
            }
    
            // other 'case' lines to check for other
            // permissions this app might request
        }
    

    在Activity中这样使用

    Permissions p=new Permissions(this,this);
            p.isPermissionGranted();
    

    如果是碎片,

    Permissions p=new Permissions(getActivity(),getActivity());
            p.isPermissionGranted();
    

    【讨论】:

    • @Aris Aslam 非常感谢你。我会试试这个,让你知道
    • Permisiions 类中的 startActivity 出现错误。我该怎么办?
    • 我不好这样使用它public void call_action(){ Intent callIntent = new Intent(Intent.ACTION_CALL); callIntent.setData(Uri.parse("tel:" + phoneNumber)); if(isPermissionGranted()) mContext.startActivity(callIntent); }
    • 如果对你有帮助,请点赞并接受我的回答
    • 我有些困惑。我在哪里可以写这行代码 Permissions p=new Permissions(getActivity(),getActivity()); p.isPermissionGranted();以及如何在 if (itemPosition == 0) {call_action();} 这样的内部获取此调用方法
    最近更新 更多