Удалить журнал вызовов только при совершении звонка из приложения

В моем приложении я звоню. После завершения вызова мне нужно получить продолжительность вызова и удалить эту запись вызова из списка журнала вызовов устройства. Все эти функции работают должным образом, как и ожидалось. Теперь проблема в том, что когда я звоню из-за пределов приложения, например, из вызова устройства по умолчанию, он удаляет текущий вызов. как его ограничить? я использую 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();
            }

        }
    }
}

person Meenaxi    schedule 05.10.2015    source источник


Ответы (1)


Вы можете воспользоваться помощью общих настроек, чтобы сохранить любой флаг, который указывает, звоните ли вы из своего приложения или нет. Например:

Когда вы звоните из своего приложения, установите общие настройки, подобные этому;

SharedPreferences sharedPreferences = getSharedPreferences("AppCallingFlag",
            Context.MODE_PRIVATE);
 SharedPreferences.Editor editor = sharedPreferences.edit();
    editor.putString("app_flag", 1);
    editor.commit();

и проверьте в широковещательном приемнике этот флаг следующим образом:

SharedPreferences sharedPreferences = context.getSharedPreferences("AppCallingFlag",
            Context.MODE_PRIVATE);
         int appFlag =  sharedPreferences.getInt("app_flag",-1);
    if(appFlag == 1){
         //delete logs
    }esle{
       //do nothing
    }

и после всех операций установить app_flag в общих настройках на 0 вот так:

SharedPreferences sharedPreferences = getSharedPreferences("AppCallingFlag",
            Context.MODE_PRIVATE);
 SharedPreferences.Editor editor = sharedPreferences.edit();
    editor.putString("app_flag", 0);
    editor.commit();
person Er.Rohit Sharma    schedule 05.10.2015
comment
это работает. Я также пробовал с незарегистрированным приемником на паузе. Но когда когда-либо начинается вызов, всегда вызывается Activity onpause. Поэтому я думаю, что остается только один вариант — использовать флаги. - person Meenaxi; 05.10.2015