В моето приложение правя обаждане. След като разговорът приключи, трябва да получа продължителността на разговора и да премахна този запис от списъка с регистъра на разговорите на устройството. Цялата тази функционалност работи правилно, както се очаква. Сега проблемът е, когато се обадя извън приложението, като от повикване на устройство по подразбиране, изтрива текущото обаждане. как да го огранича? използвам BroadcastReceiver
както е показано по-долу
@Override
public void onReceive(Context ctx, Intent intent)
{
String action = intent.getAction();
db=new DatabaseMethods(ctx);
if (action.equalsIgnoreCase("android.intent.action.PHONE_STATE"))
{
if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_RINGING))
{
//when call arrives
}
if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_OFFHOOK))
{
Toast.makeText(ctx, "EXTRA_STATE_OFFHOOK",Toast.LENGTH_LONG).show();
start_time = System.currentTimeMillis();
AppConstants.START_TIME=Utils.formatToDateTime(start_time);
AppConstants.CALL_DURATION="00:00:00";
System.out.println("Start Time Millis"+"="+start_time);
System.out.println("Start Time"+"="+AppConstants.START_TIME);
}
if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_IDLE))
{
try
{
int idOfRowToDelete = 0 ;
Uri allCalls = Uri.parse("content://call_log/calls");
String lastMinute = String.valueOf(new Date().getTime() - start_time);
//before the call started
Cursor c = ctx.getContentResolver().query(allCalls, null, Calls.DATE + " > "
+ lastMinute, null, Calls.DATE + " desc");
c.moveToFirst();
if (c.getCount() > 0) {
duration= Integer.parseInt(c.getString(c.getColumnIndex(Calls.DURATION)));
idOfRowToDelete = c.getInt(c.getColumnIndex(Calls._ID));
}
if(duration>0)
{
AppConstants.CALL_DURATION=Utils.formatSceondstoHHMMSS(duration);
}
else
{
AppConstants.CALL_DURATION="00:00:00";
}
ctx.getContentResolver().delete(allCalls, Calls._ID + "= ? ", new String[] { String.valueOf(idOfRowToDelete) });
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
db.new AsyncSaveCallDetails().execute();
}
}
}
}