Lembro-me de ser resolvedor de conteúdo, mas não tenho ideia de como iniciar a coisa.
3cross
Respostas:
69
Isso é para acessar o histórico de chamadas:
A partir do Jellybean (4.1), você precisa da seguinte permissão: <uses-permission android:name="android.permission.READ_CALL_LOG" />
Código:
Uri allCalls =Uri.parse("content://call_log/calls");Cursor c = managedQuery(allCalls,null,null,null,null);String num= c.getString(c.getColumnIndex(CallLog.Calls.NUMBER));// for numberString name= c.getString(c.getColumnIndex(CallLog.Calls.CACHED_NAME));// for nameString duration = c.getString(c.getColumnIndex(CallLog.Calls.DURATION));// for durationint type =Integer.parseInt(c.getString(c.getColumnIndex(CallLog.Calls.TYPE)));// for call type, Incoming or out going.
Não se esqueça de habilitar esta permissão: <uses-permission android: name = "android.permission.READ_CALL_LOG" /> este é o método para obter o registro de chamadas:
Aziz
Não sei, mas teoricamente posso afirmar que todas as mensagens ficam armazenadas no mesmo banco de dados. Então, sim, ele pode acessar todas as mensagens do dispositivo independentemente de dual sim ou single sim. Verifique este código e deixe-me saber se não está funcionando com dual sim. Vou fazer um pouco de P&D e fornecer um código para isso.
Abhinav Singh Maurya
1
get name sempre retornará null, tenha cuidado
vuhung3990
@Abhinav Singh Maurya, você pode me ajudar a obter o registro de chamadas photo_uri nos registros de chamadas porque não consigo obter photo_uri no registro de chamadas
Sagar
1
managedQuery () obsoleto use isto em seu lugar Cursor cursor = context.getContentResolver (). query (CallLog.Calls.CONTENT_URI, null, null, null, CallLog.Calls.DATE + "DESC");
Sai Gopi Me
67
Este é o método usado para obter o registro de chamadas. Basta colocar este método em sua classe e obter a Lista do Registro de Chamadas.
@Dwivedi Ji - É um post um pouco antigo - Seu método funciona, mas está demorando pelo menos 10 segundos para carregar todos os meus registros de chamadas.
TheDevMan
@TheDevMan, desculpe pela inconveniência, Sim, você está certo, atualizarei minha resposta em breve,
Dwivedi Ji
Obrigado, vou aguardar sua resposta!
TheDevMan de
48
use este método de qualquer lugar com um contexto
privatestaticString getCallDetails(Context context){StringBuffer stringBuffer =newStringBuffer();Cursor cursor = context.getContentResolver().query(CallLog.Calls.CONTENT_URI,null,null,null,CallLog.Calls.DATE +" DESC");int number = cursor.getColumnIndex(CallLog.Calls.NUMBER);int type = cursor.getColumnIndex(CallLog.Calls.TYPE);int date = cursor.getColumnIndex(CallLog.Calls.DATE);int duration = cursor.getColumnIndex(CallLog.Calls.DURATION);while(cursor.moveToNext()){String phNumber = cursor.getString(number);String callType = cursor.getString(type);String callDate = cursor.getString(date);Date callDayTime =newDate(Long.valueOf(callDate));String callDuration = cursor.getString(duration);String dir =null;int dircode =Integer.parseInt(callType);switch(dircode){caseCallLog.Calls.OUTGOING_TYPE:
dir ="OUTGOING";break;caseCallLog.Calls.INCOMING_TYPE:
dir ="INCOMING";break;caseCallLog.Calls.MISSED_TYPE:
dir ="MISSED";break;}
stringBuffer.append("\nPhone Number:--- "+ phNumber +" \nCall Type:--- "+ dir +" \nCall Date:--- "+ callDayTime+" \nCall duration in sec :--- "+ callDuration);
stringBuffer.append("\n----------------------------------");}
cursor.close();return stringBuffer.toString();}
Cada chamada tem todos os campos, para que você possa obter qualquer informação de que precisar: data da chamada, duração, número, tipo (ENTRADA, SAÍDA, PERDIDA), isRead, ...
Funciona com Listou Cursore há um aplicativo de amostra para ver como fica e funciona.
Ei, eu verifiquei sua solução, é boa. O único problema que estou enfrentando é como adicionar a dependência no meu projeto eclipse?
Aradhna,
@aradhna a biblioteca está usando o gradle e foi construída a partir do Android Studio. Eu acho que você precisará modificá-lo um pouco para fazê-lo funcionar no Eclipse
sromku
9
no meu projeto estou recebendo o erro int htc device.now this code is universal. Eu acho que isso é uma ajuda para você.
Se usarmos Kotlin, é mais curto. Exemplo de classe que responde para fornecer registros de chamadas:
import android.content.Contextimport android.database.Cursorimport android.provider.CallLog.Calls.*classCallsLoader{
fun getCallLogs(context:Context):List<List<String?>>{
val c = context.applicationContext
val projection = arrayOf(CACHED_NAME, NUMBER, TYPE, DATE, DURATION)
val cursor = c.contentResolver.query(
CONTENT_URI,
projection,null,null,null,null)return cursorToMatrix(cursor)}private fun cursorToMatrix(cursor:Cursor?):List<List<String?>>{
val matrix = mutableListOf<List<String?>>()
cursor?.use{while(it.moveToNext()){
val list = listOf(
it.getStringFromColumn(CACHED_NAME),
it.getStringFromColumn(NUMBER),
it.getStringFromColumn(TYPE),
it.getStringFromColumn(DATE),
it.getStringFromColumn(DURATION))
matrix.add(list.toList())}}return matrix
}private fun Cursor.getStringFromColumn(columnName:String)=
getString(getColumnIndex(columnName))}
Também podemos converter o cursor em mapa:
fun getCallLogs(context:Context):Map<String,Array<String?>>{
val c = context.applicationContext
val projection = arrayOf(CACHED_NAME, NUMBER, TYPE, DATE, DURATION)
val cursor = c.contentResolver.query(
CONTENT_URI,
projection,null,null,null,null)return cursorToMap(cursor)}private fun cursorToMap(cursor:Cursor?):Map<String,Array<String?>>{
val arraySize = cursor?.count ?:0
val map = mapOf(
CACHED_NAME to Array<String?>(arraySize){""},
NUMBER to Array<String?>(arraySize){""},
TYPE to Array<String?>(arraySize){""},
DATE to Array<String?>(arraySize){""},
DURATION to Array<String?>(arraySize){""})
cursor?.use{for(i in0until arraySize){
it.moveToNext()
map[CACHED_NAME]?.set(i, it.getStringFromColumn(CACHED_NAME))
map[NUMBER]?.set(i, it.getStringFromColumn(NUMBER))
map[TYPE]?.set(i, it.getStringFromColumn(TYPE))
map[DATE]?.set(i, it.getStringFromColumn(DATE))
map[DURATION]?.set(i, it.getStringFromColumn(DURATION))}}return map
}
Essas permissões são muito confidenciais e você terá que provar que seu aplicativo precisa delas. Mas mesmo que realmente precise deles, a equipe de suporte do Google Play pode facilmente rejeitar sua solicitação sem as devidas explicações.
Isto é o que aconteceu comigo. Depois de fornecer todas as informações necessárias junto com o vídeo de demonstração de meu aplicativo, ele foi rejeitado com a explicação de que minha "conta não está autorizada a fornecer uma determinada solução de caso de uso em meu aplicativo" (a lista de casos de uso que eles podem considerar uma exceção está listado nessa página de política). Nenhum link para qualquer declaração de política foi fornecido para explicar o que tudo isso significa. Basicamente, eles julgaram que meu aplicativo não fica sem uma explicação adequada.
Desejo a vocês boa sorte de causa com seus aplicativos, pessoal, mas tenham cuidado.
Respostas:
Isso é para acessar o histórico de chamadas:
A partir do Jellybean (4.1), você precisa da seguinte permissão:
<uses-permission android:name="android.permission.READ_CALL_LOG" />
Código:
fonte
Este é o método usado para obter o registro de chamadas. Basta colocar este método em sua classe e obter a Lista do Registro de Chamadas.
Veja isso
a saída parece
fonte
use este método de qualquer lugar com um contexto
fonte
Esta postagem é um pouco antiga, mas aqui está outra solução fácil para obter dados relacionados ao
Call
provedor de conteúdo de registros no Android:Use esta biblioteca: https://github.com/EverythingMe/easy-content-providers
Receba todas as ligações:
Cada chamada tem todos os campos, para que você possa obter qualquer informação de que precisar: data da
chamada, duração, número, tipo (ENTRADA, SAÍDA, PERDIDA), isRead, ...
Funciona com
List
ouCursor
e há um aplicativo de amostra para ver como fica e funciona.Na verdade, há suporte para todos os provedores de conteúdo Android, como: Contatos, SMS, Agenda, ... Documento completo com todas as opções: https://github.com/EverythingMe/easy-content-providers/wiki/Android-providers
Espero que também tenha ajudado :)
fonte
no meu projeto estou recebendo o erro int htc device.now this code is universal. Eu acho que isso é uma ajuda para você.
fonte
Para obter apenas o histórico de chamadas recebidas, o código abaixo o ajudará :)
fonte
Para obter o histórico de chamadas recebidas, efetuadas e perdidas, espero que este código o ajude :)
Chame este código em seu thread de segundo plano.
fonte
Use o código abaixo:
fonte
Se usarmos Kotlin, é mais curto. Exemplo de classe que responde para fornecer registros de chamadas:
Também podemos converter o cursor em mapa:
fonte
Antes de considerar tornar as permissões Ler registro de chamadas ou Ler SMS parte de seu aplicativo, recomendo fortemente que você dê uma olhada nesta política do Google Play Market: https://support.google.com/googleplay/android-developer/answer/9047303 ? hl = en
Essas permissões são muito confidenciais e você terá que provar que seu aplicativo precisa delas. Mas mesmo que realmente precise deles, a equipe de suporte do Google Play pode facilmente rejeitar sua solicitação sem as devidas explicações.
Isto é o que aconteceu comigo. Depois de fornecer todas as informações necessárias junto com o vídeo de demonstração de meu aplicativo, ele foi rejeitado com a explicação de que minha "conta não está autorizada a fornecer uma determinada solução de caso de uso em meu aplicativo" (a lista de casos de uso que eles podem considerar uma exceção está listado nessa página de política). Nenhum link para qualquer declaração de política foi fornecido para explicar o que tudo isso significa. Basicamente, eles julgaram que meu aplicativo não fica sem uma explicação adequada.
Desejo a vocês boa sorte de causa com seus aplicativos, pessoal, mas tenham cuidado.
fonte