2011-03-19 6 views

Respuesta

5

Primero tiene que configurar un receptor de difusión para detectar el estado del teléfono. Aquí es exactamente la misma pregunta: Stackoverflow - Intent to be fired when a call ends?

Y ahora para eliminar la entrada del registro de llamadas, aquí es el primer eslabón en Google: Call log deletion in Android
En el ejemplo que elimina toda la entrada de llamada para un número específico, pero se puede cambiar la consulta para eliminar la entrada de una ID de registro de llamada específica.

Espero que esto ayude. Saludos

2

acabo de probar este método de su gran trabajo en mi HTC con 4.0.3

private void deleteNumber() { 
      try { 
       String strNumberOne[] = { "00577698160" }; 
       Cursor cursor = getContentResolver().query(CallLog.Calls.CONTENT_URI, null, CallLog.Calls.NUMBER + " = ? ", strNumberOne, ""); 
       boolean bol = cursor.moveToFirst(); 
       if (bol) { 
        do { 
         int idOfRowToDelete = cursor.getInt(cursor.getColumnIndex(CallLog.Calls._ID)); 
         getContentResolver().delete(Uri.withAppendedPath(CallLog.Calls.CONTENT_URI, String.valueOf(idOfRowToDelete)), "", null); 
        } while (cursor.moveToNext()); 
       } 
      } catch (Exception ex) { 
       System.out.print("Exception here "); 
      } 
     } 
4

Im usando 4.2.2 todos modos tuve que modificar el código del aftab ya que no estaba trabajando para mí. Podría ser una cuestión difícil, dado que lo que estaba tratando de hacer es actualizar el registro de llamadas justo después de que finaliza una llamada entrante. Creo que tengo para dar O/S tiempo suficiente para actualizar la tabla antes de eliminar la entrada o no lo puedo existo:

private void deleteNumber(String phoneNumber) { 

    try { 
     Thread.sleep(4000); 
     String strNumberOne[] = { phoneNumber }; 
     Cursor cursor = context.getContentResolver().query(
       CallLog.Calls.CONTENT_URI, null, 
       CallLog.Calls.NUMBER + " = ? ", strNumberOne, ""); 
     boolean bol = cursor.moveToFirst(); 
     if (bol) { 
      do { 
       int idOfRowToDelete = cursor.getInt(cursor 
         .getColumnIndex(CallLog.Calls._ID)); 
       context.getContentResolver().delete(
         CallLog.Calls.CONTENT_URI, 
         CallLog.Calls._ID + "= ? ", 
         new String[] { String.valueOf(idOfRowToDelete) }); 
      } while (cursor.moveToNext()); 
     } 
    } catch (Exception ex) { 
     Log.v("deleteNumber", 
       "Exception, unable to remove # from call log: " 
         + ex.toString()); 
    } 
} 

y para llamar a la función corro en el otro hilo (desde im dormir):

new Thread() { 
public void run() { 
deleteNumber(incomingNumber); 
    } 
}.start(); 

Después de agregar la suspensión, parece que funciona cuando intentas eliminarlo justo después de que finaliza una llamada.

Actualización: Después último comentario se dio cuenta de que podemos establecer una contentobserver en el Android uri registro de llamadas del proveedor:

public class BlockerContentObserver extends ContentObserver{ 

private Context context; 
private String phoneNumber; 


public void setPhoneNumber(String phoneNumber) { 
    this.phoneNumber = phoneNumber; 
} 

public BlockerContentObserver(Handler handler,Context context) { 
    super(handler); 
this.context=context; 
} 

@Override 
    public boolean deliverSelfNotifications() { 
     return true; 
    } 

@Override 
public void onChange(boolean selfChange) { 
    // TODO Auto-generated method stub 
    super.onChange(selfChange); 
    Log.v(Consts.TAG,"has call log changed:"+selfChange); 
    deleteNumber(phoneNumber); 

} 

private void deleteNumber(String phoneNumber) { 


    try { 

     String strNumberOne[] = { phoneNumber }; 
     Cursor cursor = context.getContentResolver().query(
       CallLog.Calls.CONTENT_URI, null, 
       CallLog.Calls.NUMBER + " = ? ", strNumberOne, ""); 
     boolean bol = cursor.moveToFirst(); 
     if (bol) { 
      do { 
       int idOfRowToDelete = cursor.getInt(cursor 
         .getColumnIndex(CallLog.Calls._ID)); 
       context.getContentResolver().delete(
         CallLog.Calls.CONTENT_URI, 
         CallLog.Calls._ID + "= ? ", 
         new String[] { String.valueOf(idOfRowToDelete) }); 
      } while (cursor.moveToNext()); 
     } 
    } catch (Exception ex) { 
     Log.v(Consts.TAG, 
       "Exception, unable to remove # from call log: " 
         + ex.toString()); 
    } 
} 

}

Ahora registrarse para escuchar a los cambios en la base de datos del registro de llamadas que utilizan este :

mContentObserver = new BlockerContentObserver (new Handler(), context);

entonces hacemos un método de registro, ya sea para eventos o unreigster:

/*handles the registration of our content observer used for monitoring the call log*/ 
private void RegisterContentObserver(boolean shouldRegister){ 
    if(shouldRegister) 
    { 

     context.getContentResolver().registerContentObserver(
       android.provider.CallLog.Calls.CONTENT_URI, 
       true, 
       mContentObserver); 

    } 
else { 

    try { 
     context.getContentResolver().unregisterContentObserver(mContentObserver); 
    } catch (IllegalStateException ise) { 
     // Do Nothing. Observer has already been unregistered. 
    } 

} 
    } 
+0

no funciona, ¿alguna idea? sí llama a la función de eliminación, el bool es verdadero, pero el número está en el historial de registro como es –

+0

¿configuró un servidor de contenido? ¿Recibirá un evento que se le enviará cuando cambie el registro de llamadas? – j2emanue

2

versión modificada de answsers anteriores. realmente no necesitas un ciclo while. Además, no necesita Thread.sleep(4000), registre ContentObserver para CallLog.Calls.CONTENT_URI y llame al siguiente método en onChange. pero justo antes de llamar, asegúrese de anular el registro ContentObserver

public static void deleteLastCallLog(Context context, String phoneNumber) { 

     try { 
      //Thread.sleep(4000); 
      String strNumberOne[] = { phoneNumber }; 
      Cursor cursor = context.getContentResolver().query(
        CallLog.Calls.CONTENT_URI, null, 
        CallLog.Calls.NUMBER + " = ? ", strNumberOne, CallLog.Calls.DATE + " DESC"); 

      if (cursor.moveToFirst()) { 
        int idOfRowToDelete = cursor.getInt(cursor.getColumnIndex(CallLog.Calls._ID));      
        int foo = context.getContentResolver().delete(
          CallLog.Calls.CONTENT_URI, 
          CallLog.Calls._ID + " = ? ", 
          new String[] { String.valueOf(idOfRowToDelete) }); 

      } 
     } catch (Exception ex) { 
      Log.v("deleteNumber", 
        "Exception, unable to remove # from call log: " 
          + ex.toString()); 
     } 
    } 
+0

excelente idea con respecto al observador de contenido, intentaré invitarlo y actualizar mi comentario para ayudar a otros. – j2emanue

+0

¿Por qué necesita un cursor para repetir? 'ContentResolver.delete()' puede eliminar varios registros, ¿estoy equivocado? 'getContentResolver(). delete (CallLog.Calls.CONTENT_URI, CallLog.Calls.NUMBER +" =? ", new String [] {phoneNumber});' debería funcionar bien – osrl

Cuestiones relacionadas