Soy nuevo en el desarrollo de Android. Quiero hacer una llamada a un número, pero no quiero guardar el número en mi registro de llamadas. ¿Cómo puedo eliminar el número del registro de llamadas una vez que finaliza la llamada?Eliminar llamada del registro de llamadas después del final de la llamada
Respuesta
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
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 ");
}
}
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.
}
}
}
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 –
¿configuró un servidor de contenido? ¿Recibirá un evento que se le enviará cuando cambie el registro de llamadas? – j2emanue
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());
}
}
excelente idea con respecto al observador de contenido, intentaré invitarlo y actualizar mi comentario para ayudar a otros. – j2emanue
¿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
- 1. Función de llamada Ajax después del éxito
- 2. Devolución de llamada después del final de la función recursiva asincrónica
- 3. ¿Explicación del sitio de llamada?
- 4. Método de llamada particular después del intervalo de tiempo regular
- 5. Cómo agregar una devolución de llamada después del registro con Rails3 y Devise
- 6. jQuery - redirigir después de la llamada ajax
- 7. Cancelar store.remove después de la llamada del servidor en ExtJS 4
- 8. Eliminar nueva línea del final del archivo
- 9. señal de llamada después de la horquilla
- 10. Llamada falsa del sistema en ruby
- 11. Llamada global para llamadas Ajax en JQuery
- 12. obtienen llamadas nombre de la función de la función llamada
- 13. Llamada al método privado que retiene la pila de llamadas
- 14. try-lock llamada mutex vs llamadas CAS
- 15. onServiceConnected llamada después método bindService
- 16. AngularJS: devolución de llamada después de renderizar (trabajar con DOM después del procesamiento)
- 17. Datatable no se actualiza después de la exitosa llamada ajax
- 18. Comando de llamada del código detrás
- 19. Reproducción del tono de llamada predeterminado
- 20. R - Obtener formales del objeto de llamada
- 21. Rieles: método de llamada dentro del modelo
- 22. Llamada de función dentro del código XAML?
- 23. Llamada de Android de nuevo después de que la representación del diseño se haya completado?
- 24. Error de llamadas del iPad AJAX después de 30 minutos
- 25. Implementando la devolución de llamada del servicio a la actividad
- 26. Devolución de llamada del lado del cliente en GWT
- 27. ¿Método de base de llamada al principio o al final del método?
- 28. Cómo eliminar caracteres del final del campo en la base de datos MySql
- 29. Devolución de llamada después de __doPostBack()?
- 30. función de llamada después de .load (Jquery)
Elija su respuesta. – clauziere