Премахване на регистъра на обажданията само при извършване на обаждане от приложение

В моето приложение правя обаждане. След като разговорът приключи, трябва да получа продължителността на разговора и да премахна този запис от списъка с регистъра на разговорите на устройството. Цялата тази функционалност работи правилно, както се очаква. Сега проблемът е, когато се обадя извън приложението, като от повикване на устройство по подразбиране, изтрива текущото обаждане. как да го огранича? използвам 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
работи. Опитах и ​​с нерегистриран приемник на пауза. Но когато започне обаждане, винаги се извиква дейност на пауза. Така че мисля, че единствената оставаща опция е използването на флагове. - person Meenaxi; 05.10.2015