Android 以编程方式获取通话期间的通话持续时间?

Android 以编程方式获取通话期间的通话持续时间?,android,Android,我正在创建一个应用程序,它可以访问电话状态,并将能够根据某些限制结束传出呼叫。我能够通过以下方式实现这一目标: if (!intent.getAction().equals("android.intent.action.PHONE_STATE")) return; else { String time = finalprefs.getString("timedelay","0");

我正在创建一个应用程序,它可以访问电话状态,并将能够根据某些限制结束传出呼叫。我能够通过以下方式实现这一目标:

if (!intent.getAction().equals("android.intent.action.PHONE_STATE"))
                return;
            else
            {

               String time = finalprefs.getString("timedelay","0");
               System.out.println("TIME - "+time);
                number = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
                WhitelistDAO whiteListDao = new WhitelistDAO(context);
                List<Whitelist> whiteList = whiteListDao.getAllWhitelist();
                if(number != null) {
                    number =  lastten(number);
                    Log.e("CALLED NUMBER", "NUM - " + number);
                    Log.e("BLOCKED NUMBER", "BLLACK - " + new Whitelist(number).toString());
                    // Check, whether this is a member of "Black listed" phone numbers stored in the database
                    if (whiteList.contains(new Whitelist(number))) {
                        Log.e("Call","Allowed");
                        Toast.makeText(getApplicationContext(),"Success",Toast.LENGTH_SHORT).show();
                    } else {
                        Toast.makeText(getApplicationContext(),"This call is not allowed by your administration! Contact Karthik",Toast.LENGTH_SHORT).show();
                        disconnectPhoneItelephony(context);

                        return;
                    }
                }
if(!intent.getAction().equals(“android.intent.action.PHONE_STATE”))
返回;
其他的
{
String time=finalprefs.getString(“timedelay”,“0”);
System.out.println(“时间-”+时间);
number=intent.getStringExtra(TelephonyManager.EXTRA\u传入\u编号);
WhitelistDAO WhitelistDAO=新的WhitelistDAO(上下文);
List whiteList=whiteListDao.getAllWhitelist();
如果(数字!=null){
数字=最后十(数字);
Log.e(“被叫号码”,“NUM-”+号码);
Log.e(“阻止的编号”、“BLLACK-”+新的白名单(编号).toString());
//检查,这是否是存储在数据库中的“黑名单”电话号码的成员
if(白名单.包含(新白名单(编号))){
Log.e(“呼叫”、“允许”);
Toast.makeText(getApplicationContext(),“Success”,Toast.LENGTH\u SHORT.show();
}否则{
Toast.makeText(getApplicationContext(),“您的管理不允许此调用!请与Karthik联系”,Toast.LENGTH_SHORT.show();
断开PhoneItelePhony(上下文);
返回;
}
}
但是现在我想在连接10分钟后断开呼出电话的连接!我搜索了这个,但没有得到任何正确的解决方案!大多数信息都表明不可能在通话时获得通话持续时间!那么有解决方案吗


请帮助!

试试这段代码,我还为通话记录添加了权限

public class MainActivity extends AppCompatActivity {

private static final int REQUEST_PERMISSIONS_REQUEST_CODE = 1;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    if (!checkPermissions()) {
        requestPermissions();
    } else {

        getCallDetails();
    }

}

private void getCallDetails() {
    StringBuffer sb = new StringBuffer();
    Uri contacts = CallLog.Calls.CONTENT_URI;
    Cursor managedCursor = this.getContentResolver().query(contacts, null, null, null, null);
    int number = managedCursor.getColumnIndex(CallLog.Calls.NUMBER);
    int type = managedCursor.getColumnIndex(CallLog.Calls.TYPE);
    int date = managedCursor.getColumnIndex(CallLog.Calls.DATE);
    int duration = managedCursor.getColumnIndex(CallLog.Calls.DURATION);
    sb.append("Call Details :");
    while (managedCursor.moveToNext()) {

        HashMap rowDataCall = new HashMap<String, String>();

        String phNumber = managedCursor.getString(number);
        String callType = managedCursor.getString(type);
        String callDate = managedCursor.getString(date);
        String callDayTime = new Date(Long.valueOf(callDate)).toString();
        // long timestamp = convertDateToTimestamp(callDayTime);
        String callDuration = managedCursor.getString(duration);
        String dir = null;
        int dircode = Integer.parseInt(callType);
        switch (dircode) {
            case CallLog.Calls.OUTGOING_TYPE:
                dir = "OUTGOING";
                break;

            case CallLog.Calls.INCOMING_TYPE:
                dir = "INCOMING";
                break;

            case CallLog.Calls.MISSED_TYPE:
                dir = "MISSED";
                break;
        }
        sb.append("\nPhone Number:--- " + phNumber + " \nCall Type:--- " + dir + " \nCall Date:--- " + callDayTime + " \nCall duration in sec :--- " + callDuration);
        sb.append("\n----------------------------------");


    }
    managedCursor.close();
    System.out.println(sb);
}

/**
 * this method request to permission asked.
 */
private void requestPermissions() {
    boolean shouldProvideRationale =
            ActivityCompat.shouldShowRequestPermissionRationale(this,
                    Manifest.permission.READ_CALL_LOG);

    if (shouldProvideRationale) {
    } else {
        Log.i("Error", "Requesting permission");
        // previously and checked "Never ask again".
        ActivityCompat.requestPermissions(MainActivity.this,
                new String[]{Manifest.permission.READ_CALL_LOG},
                REQUEST_PERMISSIONS_REQUEST_CODE);
    }
}

/**
 * this method check permission and return current state of permission need.
 */
private boolean checkPermissions() {
    int permissionState = ActivityCompat.checkSelfPermission(this,
            Manifest.permission.READ_CALL_LOG);
    return permissionState == PackageManager.PERMISSION_GRANTED;
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == REQUEST_PERMISSIONS_REQUEST_CODE) {
        if (grantResults.length <= 0) {
            // If user interaction was interrupted, the permission request is cancelled and you
            // receive empty arrays.
            Log.i("Error", "User interaction was cancelled.");
        } else if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // Permission was granted. Kick off the process of building and connecting
            // GoogleApiClient.
            getCallDetails();
        } else {
        }
    }

}
public类MainActivity扩展了AppCompatActivity{
私有静态最终整数请求\权限\请求\代码=1;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
如果(!checkPermissions()){
请求权限();
}否则{
getCallDetails();
}
}
私有void getCallDetails(){
StringBuffer sb=新的StringBuffer();
Uri contacts=CallLog.Calls.CONTENT\u Uri;
Cursor managedCursor=this.getContentResolver().query(contacts,null,null,null);
int number=managedCursor.getColumnIndex(CallLog.Calls.number);
int type=managedCursor.getColumnIndex(CallLog.Calls.type);
int date=managedCursor.getColumnIndex(CallLog.Calls.date);
int duration=managedCursor.getColumnIndex(CallLog.Calls.duration);
某人附加(“通话详情:”);
while(managedCursor.moveToNext()){
HashMap rowDataCall=新建HashMap();
字符串phNumber=managedCursor.getString(数字);
String callType=managedCursor.getString(类型);
String callDate=managedCursor.getString(日期);
字符串callDay=新日期(Long.valueOf(callDate)).toString();
//长时间戳=转换日期到时间戳(CallDaily);
String callDuration=managedCursor.getString(duration);
字符串dir=null;
int dircode=Integer.parseInt(callType);
开关(dircode){
案例CallLog.Calls.OUTGOING_类型:
dir=“传出”;
打破
案例CallLog.Calls.INCOMING_类型:
dir=“传入”;
打破
案例CallLog.Calls.MISSED_类型:
dir=“MISSED”;
打破
}
sb.追加(“\n电话号码:——“+phNumber+”\n呼叫类型:——“+dir+”\n呼叫日期:——“+callday+”\n呼叫持续时间(秒):——“+callDuration);
sb.追加(“\n---------------------------------------------------”);
}
managedCursor.close();
系统输出打印LN(sb);
}
/**
*此方法用于请求权限。
*/
私有void requestPermissions(){
布尔应提供=
ActivityCompat.应显示请求许可理由(此,
Manifest.permission.READ\u CALL\u LOG);
如果(应提供){
}否则{
Log.i(“错误”,“请求许可”);
//之前,选中“永不再问”。
ActivityCompat.requestPermissions(MainActivity.this,
新字符串[]{Manifest.permission.READ_CALL_LOG},
请求\权限\请求\代码);
}
}
/**
*此方法检查权限并返回权限需要的当前状态。
*/
私有布尔检查权限(){
int permissionState=ActivityCompat.checkSelfPermission(此,
Manifest.permission.READ\u CALL\u LOG);
返回permissionState==PackageManager.PERMISSION\u已授予;
}
@凌驾
public void onRequestPermissionsResult(int-requestCode,@NonNull-String[]permissions,@NonNull-int[]grantResults){
super.onRequestPermissionsResult(请求代码、权限、授权结果);
if(requestCode==请求权限请求代码){

如果(grantResults.length您似乎想计时通话,并在10分钟后结束通话

因此,我建议启动一个计时器,为10分钟的对话计时,然后使用处理程序,检查同一个呼叫是否仍在进行:如果继续->结束它

在Java中:

//call this method when call is starting
void startTimer() {
    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {//this method will execute after 10 minutes
            //check if call is still on going
            //if so - write the logic to end call here
        }
    }, 1000 * 60 * 10); //10 min in milli-seconds
}
在科特林:

//call this method when call is starting
private fun startTimer() {
    Handler().postDelayed({ //this method will execute after 10 minutes
        //check if call is still on going
        //if so - write the logic to end call here
    }, 1000 * 60 * 10) //10 min in milli-seconds
}

说清楚一点,你想在10分钟后暂停通话吗?@GalYedidovich。是的,准确地说,它只能得到通话中断后的时间,对吗?我的目标是在10分钟后断开通话!那么我怎么能理解用户在n分钟后断开通话的时间呢?你能分享一个示例代码吗?我是android初学者!是的,我会创建一个现在;)
//call this method when call is starting
private fun startTimer() {
    Handler().postDelayed({ //this method will execute after 10 minutes
        //check if call is still on going
        //if so - write the logic to end call here
    }, 1000 * 60 * 10) //10 min in milli-seconds
}