Ich erinnere mich, dass es Content Resolver ist, aber ich habe keine Ahnung, wie ich das Ding starten soll.
3cross
Antworten:
69
Dies ist für den Zugriff auf den Anrufverlauf:
Ab Jellybean (4.1) benötigen Sie folgende Erlaubnis: <uses-permission android:name="android.permission.READ_CALL_LOG" />
Code:
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.
Vergessen Sie nicht, diese Berechtigung zu aktivieren: <Verwendungsberechtigung android: name = "android.permission.READ_CALL_LOG" /> Dies ist die Methode, um das Anrufprotokoll abzurufen:
Aziz
Ich weiß das nicht, aber theoretisch kann ich sagen, dass alle Nachrichten in derselben Datenbank gespeichert sind. Also ja, es kann auf alle Nachrichten des Geräts zugreifen, unabhängig von Dual-Sim oder Single-Sim. Überprüfen Sie diesen Code und lassen Sie mich wissen, wenn er nicht mit Dual-Sim funktioniert. Ich werde etwas Forschung und Entwicklung betreiben und Ihnen einen Code dafür zur Verfügung stellen.
Abhinav Singh Maurya
1
get name wird immer null zurückgeben, seien Sie vorsichtig
vuhung3990
@ Abhinav Singh Maurya können Sie mir helfen, Anrufprotokoll photo_uri aus Anrufprotokollen zu erhalten, weil ich photo_uri nicht aus Anrufprotokoll erhalten kann
Sagar
1
verwalteteQuery () veraltet verwenden Sie dies stattdessen Cursor cursor = context.getContentResolver (). query (CallLog.Calls.CONTENT_URI, null, null, null, CallLog.Calls.DATE + "DESC");
Sai Gopi Me
67
Mit dieser Methode wird das Anrufprotokoll abgerufen. Fügen Sie diese Methode einfach in Ihre Klasse ein und erhalten Sie die Liste des Anrufprotokolls.
Ich erhalte eine Fehlermeldung bei manageQuery (CallLog.Calls.CONTENT_URI, null, null, null, null);
Sunil Parmar
5
Ich habe contentResolver.query verwendet (CallLog.Calls.CONTENT_URI, null, null, null, null);
Sunil Parmar
@ Dwivedi Ji - Es ist ein bisschen ein alter Beitrag - Ihre Methode funktioniert, aber es dauert mindestens 10 Sekunden, um alle meine Anrufprotokolle zu laden.
TheDevMan
@ TheDevMan, entschuldigen Sie Ihre Unannehmlichkeiten. Ja, Sie haben Recht, ich werde meine Antwort bald aktualisieren.
Dwivedi Ji
Danke ich werde auf deine Antwort warten!
TheDevMan
48
Verwenden Sie diese Methode von überall mit einem Kontext
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();}
Jeder Anruf verfügt über alle Felder, sodass Sie alle erforderlichen Informationen erhalten können: Anrufdatum, Dauer, Nummer, Typ (EINGEHEND, AUSGANG, VERPASST), isRead, ...
Es funktioniert mit Listoder Cursorund es gibt eine Beispiel-App, um zu sehen, wie es aussieht und funktioniert.
Hey, ich habe deine Lösung überprüft, es ist gut. Das einzige Problem, mit dem ich konfrontiert bin, ist, wie ich die Abhängigkeit in mein Eclipse-Projekt einfügen kann.
Aradhna
@aradhna Die Bibliothek verwendet Gradle und wurde aus Android Studio erstellt. Ich denke, Sie müssen es ein wenig ändern, damit es auf Eclipse
sromku
9
In meinem Projekt erhalte ich eine Fehlermeldung im HTC-Gerät. Jetzt ist dieser Code universell. Ich denke, das ist Hilfe für dich.
Wenn wir Kotlin verwenden, ist es kürzer. Beispiel einer Klasse, die auf Bereitstellungsprotokolle reagiert:
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))}
Wir können den Cursor auch in eine Karte konvertieren:
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
}
Diese Berechtigungen sind sehr vertraulich und Sie müssen nachweisen, dass Ihre Anwendung sie benötigt. Aber selbst wenn es wirklich benötigt wird, kann das Google Play Support-Team Ihre Anfrage ohne entsprechende Erklärungen leicht ablehnen.
Das ist mir passiert. Nachdem ich alle erforderlichen Informationen zusammen mit dem Demonstrationsvideo meiner Bewerbung bereitgestellt hatte, wurde diese mit der Erklärung abgelehnt, dass mein "Konto nicht berechtigt ist, eine bestimmte Anwendungsfalllösung in meiner Bewerbung bereitzustellen". (die Liste der Anwendungsfälle, die sie möglicherweise als Ausnahme betrachten ist auf dieser Richtlinienseite aufgeführt). Es wurde kein Link zu einer Richtlinienerklärung bereitgestellt, um zu erklären, was dies alles bedeutet. Im Grunde haben sie meine App nur als nicht ohne richtige Erklärung beurteilt.
Ich wünsche Ihnen viel Glück mit Ihren Bewerbungen, aber seien Sie vorsichtig.
Antworten:
Dies ist für den Zugriff auf den Anrufverlauf:
Ab Jellybean (4.1) benötigen Sie folgende Erlaubnis:
<uses-permission android:name="android.permission.READ_CALL_LOG" />
Code:
quelle
Mit dieser Methode wird das Anrufprotokoll abgerufen. Fügen Sie diese Methode einfach in Ihre Klasse ein und erhalten Sie die Liste des Anrufprotokolls.
Schau dir das an
Die Ausgabe sieht aus
quelle
Verwenden Sie diese Methode von überall mit einem Kontext
quelle
Dieser Beitrag ist ein bisschen alt, aber hier ist eine weitere einfache Lösung, um Daten zum
Call
Anbieter von Protokollinhalten in Android abzurufen:Verwenden Sie diese Bibliothek: https://github.com/EverythingMe/easy-content-providers
Erhalten Sie alle Anrufe:
Jeder Anruf verfügt über alle Felder, sodass Sie alle erforderlichen Informationen erhalten können:
Anrufdatum, Dauer, Nummer, Typ (EINGEHEND, AUSGANG, VERPASST), isRead, ...
Es funktioniert mit
List
oderCursor
und es gibt eine Beispiel-App, um zu sehen, wie es aussieht und funktioniert.In der Tat gibt es eine Unterstützung für alle Android-Inhaltsanbieter wie: Kontakte, SMS, Kalender, ... Vollständiges Dokument mit allen Optionen: https://github.com/EverythingMe/easy-content-providers/wiki/Android-providers
Hoffe es hat auch geholfen :)
quelle
In meinem Projekt erhalte ich eine Fehlermeldung im HTC-Gerät. Jetzt ist dieser Code universell. Ich denke, das ist Hilfe für dich.
quelle
Um nur den Verlauf eingehender Anrufe zu erhalten, hilft Ihnen der folgende Code :)
quelle
Hoffen Sie, dass dieser Code Ihnen hilft, um den Verlauf eingehender, ausgehender und verpasster Anrufe zu erhalten :)
Rufen Sie diesen Code in Ihrem Hintergrund-Thread auf.
quelle
Verwenden Sie den folgenden Code:
quelle
Wenn wir Kotlin verwenden, ist es kürzer. Beispiel einer Klasse, die auf Bereitstellungsprotokolle reagiert:
Wir können den Cursor auch in eine Karte konvertieren:
quelle
Bevor Sie erwägen, die Berechtigungen "Anrufprotokoll lesen" oder "SMS lesen" zu einem Teil Ihrer Anwendung zu machen, empfehlen wir Ihnen dringend, sich diese Richtlinie von Google Play Market anzusehen: https://support.google.com/googleplay/android-developer/answer/9047303 hl = en
Diese Berechtigungen sind sehr vertraulich und Sie müssen nachweisen, dass Ihre Anwendung sie benötigt. Aber selbst wenn es wirklich benötigt wird, kann das Google Play Support-Team Ihre Anfrage ohne entsprechende Erklärungen leicht ablehnen.
Das ist mir passiert. Nachdem ich alle erforderlichen Informationen zusammen mit dem Demonstrationsvideo meiner Bewerbung bereitgestellt hatte, wurde diese mit der Erklärung abgelehnt, dass mein "Konto nicht berechtigt ist, eine bestimmte Anwendungsfalllösung in meiner Bewerbung bereitzustellen". (die Liste der Anwendungsfälle, die sie möglicherweise als Ausnahme betrachten ist auf dieser Richtlinienseite aufgeführt). Es wurde kein Link zu einer Richtlinienerklärung bereitgestellt, um zu erklären, was dies alles bedeutet. Im Grunde haben sie meine App nur als nicht ohne richtige Erklärung beurteilt.
Ich wünsche Ihnen viel Glück mit Ihren Bewerbungen, aber seien Sie vorsichtig.
quelle