আমি কল লগ পেতে চাই। উদাহরণস্বরূপ ব্যবহারকারীর দ্বারা কল করা সংখ্যা, কল করা মিনিটের সংখ্যা ইত্যাদি
আমি কীভাবে এন্ড্রয়েড এ অর্জন করব?
উত্তর:
এটি ফোন কল ইতিহাস অ্যাক্সেসের জন্য:
জেলিবিয়ান হিসাবে (4.1) আপনার নিম্নলিখিত অনুমতি প্রয়োজন:
<uses-permission android:name="android.permission.READ_CALL_LOG" />
কোড:
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 number
String name= c.getString(c.getColumnIndex(CallLog.Calls.CACHED_NAME));// for name
String duration = c.getString(c.getColumnIndex(CallLog.Calls.DURATION));// for duration
int type = Integer.parseInt(c.getString(c.getColumnIndex(CallLog.Calls.TYPE)));// for call type, Incoming or out going.
কল লগ পাওয়ার জন্য এই পদ্ধতিটি ব্যবহৃত হয়। কেবল এই পদ্ধতিটি আপনার শ্রেণিতে রাখুন এবং কল লগের তালিকা পান।
private String getCallDetails() {
StringBuffer sb = new StringBuffer();
Cursor managedCursor = managedQuery(CallLog.Calls.CONTENT_URI, null,
null, null, null);
int number = managedCursor.getColumnIndex(CallLog.Calls.NUMBER);
int type = managedCursor.getColumnIndex(CallLog.Calls.TYPE);
int date = managedCursor.getColumnIndex(CallLog.Calls.DATE);
int duration = managedCursor.getColumnIndex(CallLog.Calls.DURATION);
sb.append("Call Details :");
while (managedCursor.moveToNext()) {
String phNumber = managedCursor.getString(number);
String callType = managedCursor.getString(type);
String callDate = managedCursor.getString(date);
Date callDayTime = new Date(Long.valueOf(callDate));
String callDuration = managedCursor.getString(duration);
String dir = null;
int dircode = Integer.parseInt(callType);
switch (dircode) {
case CallLog.Calls.OUTGOING_TYPE:
dir = "OUTGOING";
break;
case CallLog.Calls.INCOMING_TYPE:
dir = "INCOMING";
break;
case CallLog.Calls.MISSED_TYPE:
dir = "MISSED";
break;
}
sb.append("\nPhone Number:--- " + phNumber + " \nCall Type:--- "
+ dir + " \nCall Date:--- " + callDayTime
+ " \nCall duration in sec :--- " + callDuration);
sb.append("\n----------------------------------");
}
managedCursor.close();
return sb.toString();
}
আউটপুট চেহারা

প্রসঙ্গ সহ যে কোনও জায়গা থেকে এই পদ্ধতিটি ব্যবহার করুন
private static String getCallDetails(Context context) {
StringBuffer stringBuffer = new StringBuffer();
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 = new Date(Long.valueOf(callDate));
String callDuration = cursor.getString(duration);
String dir = null;
int dircode = Integer.parseInt(callType);
switch (dircode) {
case CallLog.Calls.OUTGOING_TYPE:
dir = "OUTGOING";
break;
case CallLog.Calls.INCOMING_TYPE:
dir = "INCOMING";
break;
case CallLog.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();
}
এই পোস্টটি কিছুটা পুরাতন তবে Callঅ্যান্ড্রয়েডে লগ সামগ্রী সরবরাহকারীর সাথে সম্পর্কিত ডেটা পাওয়ার আরও একটি সহজ সমাধান :
এই লিবিবটি ব্যবহার করুন: https://github.com/EverythingMe/easy-content-provider
সমস্ত কল পান:
CallsProvider callsProvider = new CallsProvider(context);
List<Call> calls = callsProvider.getCalls().getList();
প্রতিটি কল , সব ক্ষেত্র রয়েছে, যাতে আপনি যেকোন তথ্য আপনি প্রয়োজন পেতে পারেন:
callDate, সময়কাল, সংখ্যা, টাইপ (অন্তর্মুখী, বহির্গামী, মিস), isRead ...
এটা দিয়ে কাজ করে Listবা Cursorসেখানে কিভাবে এটি দেখায় এবং কাজ দেখার জন্য একটি নমুনা অ্যাপ্লিকেশন।
প্রকৃতপক্ষে, সমস্ত অ্যান্ড্রয়েড সামগ্রী সরবরাহকারী যেমন: পরিচিতি, এসএমএস, ক্যালেন্ডার, ... সমস্ত বিকল্প সহ সম্পূর্ণ ডক : এর জন্য একটি সমর্থন রয়েছে : https://github.com
আশা করি এটিও সহায়তা করেছে :)
আমার প্রকল্পে আমি ত্রুটি পেয়ে যাচ্ছি এইচটিসি ডিভাইস now এখন এই কোডটি সর্বজনীন। আমি মনে করি এটি আপনার জন্য সহায়ক।
public class CustomContentObserver extends ContentObserver {
public CustomContentObserver(Handler handler) {
super(handler);
System.out.println("Content obser");
}
public void onChange(boolean selfChange) {
super.onChange(selfChange);
String lastCallnumber;
currentDate = sdfcur.format(calender.getTime());
System.out.println("Content obser onChange()");
Log.d("PhoneService", "custom StringsContentObserver.onChange( " + selfChange + ")");
//if(!callFlag){
String[] projection = new String[]{CallLog.Calls.NUMBER,
CallLog.Calls.TYPE,
CallLog.Calls.DURATION,
CallLog.Calls.CACHED_NAME,
CallLog.Calls._ID};
Cursor c;
c=mContext.getContentResolver().query(CallLog.Calls.CONTENT_URI, projection, null, null, CallLog.Calls._ID + " DESC");
if(c.getCount()!=0){
c.moveToFirst();
lastCallnumber = c.getString(0);
String type=c.getString(1);
String duration=c.getString(2);
String name=c.getString(3);
String id=c.getString(4);
System.out.println("CALLLLing:"+lastCallnumber+"Type:"+type);
Database db=new Database(mContext);
Cursor cur =db.getFirstRecord(lastCallnumber);
final String endCall=lastCallnumber;
//checking incoming/outgoing call
if(type.equals("3")){
//missed call
}else if(type.equals("1")){
//incoming call
}else if(type.equals("2")){
//outgoing call
}
}
c.close();
}
}
ইনকামিং, আউটগোয়িং এবং মিস কল ইতিহাস পেতে, আশা করি এই কোডটি আপনাকে সহায়তা করবে :)
আপনার পটভূমির থ্রেডে এই কোডটি কল করুন।
StringBuffer sb = new StringBuffer();
String[] projection = new String[] {
CallLog.Calls.CACHED_NAME,
CallLog.Calls.NUMBER,
CallLog.Calls.TYPE,
CallLog.Calls.DATE,
CallLog.Calls.DURATION
};
sb.append("Call Details :");
// String strOrder = android.provider.CallLog.Calls.DATE + " DESC";
Cursor managedCursor = getApplicationContext().getContentResolver().query(CallLog.Calls.CONTENT_URI, projection, null, null, null);
while (managedCursor.moveToNext()) {
String name = managedCursor.getString(0); //name
String number = managedCursor.getString(1); // number
String type = managedCursor.getString(2); // type
String date = managedCursor.getString(3); // time
@SuppressLint("SimpleDateFormat")
SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy HH:mm");
String dateString = formatter.format(new Date(Long.parseLong(date)));
String duration = managedCursor.getString(4); // duration
String dir = null;
int dircode = Integer.parseInt(type);
switch (dircode) {
case CallLog.Calls.OUTGOING_TYPE:
dir = "OUTGOING";
break;
case CallLog.Calls.INCOMING_TYPE:
dir = "INCOMING";
break;
case CallLog.Calls.MISSED_TYPE:
dir = "MISSED";
break;
}
sb.append("\nPhone Name :-- "+name+" Number:--- " + number + " \nCall Type:--- " + dir + " \nCall Date:--- " + dateString + " \nCall duration in sec :--- " + duration);
sb.append("\n----------------------------------");
কেবলমাত্র আগত কল ইতিহাস পেতে, নীচের কোডটি আপনাকে সহায়তা করবে :)
private void getCallDetailsAgil() {
StringBuffer sb = new StringBuffer();
Cursor managedCursor = managedQuery(CallLog.Calls.CONTENT_URI, null, null, null, null);
int number = managedCursor.getColumnIndex(CallLog.Calls.NUMBER);
int type = managedCursor.getColumnIndex(CallLog.Calls.TYPE);
int date = managedCursor.getColumnIndex(CallLog.Calls.DATE);
int duration = managedCursor.getColumnIndex(CallLog.Calls.DURATION);
sb.append("Call Details :");
while (managedCursor.moveToNext()) {
String phNumber = managedCursor.getString(number);
String callType = managedCursor.getString(type);
String callDate = managedCursor.getString(date);
Date callDayTime = new Date(Long.valueOf(callDate));
String callDuration = managedCursor.getString(duration);
String dir = null;
int dircode = Integer.parseInt(callType);
switch (dircode) {
case CallLog.Calls.OUTGOING_TYPE:
dir = "OUTGOING";
break;
case CallLog.Calls.INCOMING_TYPE:
dir = "INCOMING";
sb.append("\nPhone Number:--- " + phNumber + " \nCall Type:--- " + dir + " \nCall Date:--- " + callDayTime + " \nCall duration in sec :--- " + callDuration);
sb.append("\n----------------------------------");
miss_cal.setText(sb);
break;
case CallLog.Calls.MISSED_TYPE:
dir = "MISSED";
break;
}
}
managedCursor.close();
}
নীচে কোড ব্যবহার করুন:
private void getCallDeatils() {
StringBuffer stringBuffer = new StringBuffer();
Cursor managedCursor = getActivity().managedQuery(CallLog.Calls.CONTENT_URI, null, null, null, null);
int number = managedCursor.getColumnIndex(CallLog.Calls.NUMBER);
int type = managedCursor.getColumnIndex(CallLog.Calls.TYPE);
int date = managedCursor.getColumnIndex(CallLog.Calls.DATE);
int duration = managedCursor.getColumnIndex(CallLog.Calls.DURATION);
stringBuffer.append("Call Deatils");
while (managedCursor.moveToNext()) {
String phNumber = managedCursor.getString(number);
String callType = managedCursor.getString(type);
String callDate = managedCursor.getString(date);
Date callDayTime = new Date(Long.valueOf(callDate));
DateFormat df = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
String reportDate = df.format(callDayTime);
String callDuration = managedCursor.getString(duration);
String dir = null;
int dircode = Integer.parseInt(callType);
switch (dircode) {
case CallLog.Calls.OUTGOING_TYPE:
dir = "OUTGOING";
break;
case CallLog.Calls.INCOMING_TYPE:
dir = "INCOMING";
break;
case CallLog.Calls.MISSED_TYPE:
dir = "MISSED";
break;
}
stringBuffer.append("\nPhone Number:--- " + phNumber + " \nCall Type:--- " + dir + " \nCall Date:--- " +callDate + " \nCall duration in sec :--- " + callDuration);
stringBuffer.append("\n----------------------------------");
logs.add(new LogClass(phNumber,dir,reportDate,callDuration));
}
যদি আমরা কোটলিন ব্যবহার করি তবে এটি খাটো। শ্রেণীর উদাহরণ যা কল লগ সরবরাহের জন্য প্রতিক্রিয়া জানায়:
import android.content.Context
import android.database.Cursor
import android.provider.CallLog.Calls.*
class CallsLoader {
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))
}
আমরা কার্সারকে মানচিত্রে রূপান্তর করতে পারি:
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 in 0 until 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
}
আপনার কল করার জন্য লগ পড়ুন বা এসএমএসের অনুমতিগুলি পড়ার বিবেচনা করার আগে আমি আপনাকে গুগল প্লে মার্কেটের এই নীতিটি একবার দেখার জন্য দৃ strongly়ভাবে পরামর্শ দিচ্ছি: https://support.google.com/googleplay/android-developer/answer/9047303 ? এইচএল = এন
এই অনুমতিগুলি খুব সংবেদনশীল এবং আপনাকে প্রমাণ করতে হবে যে আপনার অ্যাপ্লিকেশনটি তাদের প্রয়োজন। তবে এমনকি যদি তাদের সত্যই এটি প্রয়োজন হয় তবে গুগল প্লে সমর্থন টিম যথাযথ ব্যাখ্যা ছাড়াই আপনার অনুরোধটি সহজেই প্রত্যাখ্যান করতে পারে।
এই আমার ঘটেছে কি। আমার আবেদনের বিক্ষোভ ভিডিও সহ সমস্ত প্রয়োজনীয় তথ্য সরবরাহ করার পরে আমার "অ্যাকাউন্টটি আমার অ্যাপ্লিকেশনটিতে নির্দিষ্ট ব্যবহারের কেস সমাধান দেওয়ার জন্য অনুমোদিত নয়" এই ব্যাখ্যা দিয়ে প্রত্যাখ্যান করা হয়েছিল (তারা ব্যবহারের কেসগুলির তালিকা যা তারা ব্যতিক্রম হিসাবে বিবেচনা করতে পারে) নীতি পৃষ্ঠাতে তালিকাভুক্ত)। কোনও নীতিগত বিবৃতিতে কোনও লিঙ্ক সরবরাহ করা হয়নি এটির অর্থ কী তা বোঝাতে। মূলত তারা আমার ব্যাখ্যাকে যথাযথ ব্যাখ্যা ব্যতিরেকে না গিয়ে বিচার করেছেন।
আমি আপনার অ্যাপ্লিকেশন ছেলেদের জন্য ভাল ভাগ্য কামনা করি তবে সাবধান হন।