অ্যান্ড্রয়েডের জন্য আমি কীভাবে কল লগ অ্যাক্সেস করব?


97

আমি কল লগ পেতে চাই। উদাহরণস্বরূপ ব্যবহারকারীর দ্বারা কল করা সংখ্যা, কল করা মিনিটের সংখ্যা ইত্যাদি

আমি কীভাবে এন্ড্রয়েড এ অর্জন করব?



আমি মনে করি এটি বিষয়বস্তু সমাধানকারী হ'ল, তবে কীভাবে জিনিসটি শুরু করবেন সে সম্পর্কে আমার কোনও ধারণা নেই।
ক্রস

উত্তর:


70

এটি ফোন কল ইতিহাস অ্যাক্সেসের জন্য:

জেলিবিয়ান হিসাবে (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.

11
এই অনুমতিটি সক্ষম করতে ভুলবেন না: <ব্যবহার-অনুমতি অ্যান্ড্রয়েড: নাম = "android.permission.READ_CALL_LOG" /> কল লগ পাওয়ার এই পদ্ধতি:
আজিজ

আমি এটি জানি না তবে তাত্ত্বিকভাবে আমি বলতে পারি যে সমস্ত বার্তা একই ডাটাবেসে সংরক্ষিত। সুতরাং হ্যাঁ এটি দ্বৈত সিম বা একক সিম নির্বিশেষে ডিভাইসের সমস্ত বার্তা অ্যাক্সেস করতে পারে। এই কোডটি চেক করুন এবং যদি এটি দ্বৈত সিমের সাথে কাজ করে না তবে আমাকে জানান। আমি কিছু গবেষণা ও উন্নয়ন করব এবং এর জন্য আপনাকে একটি কোড সরবরাহ করব।
অভিনব সিং

4
নামটি সর্বদা
নালায়

@ অভিনব সিং মौर্যা আপনি আমাকে কল লগ থেকে কল লগ ফটো_উড়ি পেতে সাহায্য করতে পারেন কারণ আমি কল লগ থেকে ফটো_রি পেতে পারি না
সাগর

4
ম্যানেজডকুইয়ারি () এর পরিবর্তে কার্সার কার্সার = প্রসঙ্গ।
সাঁই গোপী

67

কল লগ পাওয়ার জন্য এই পদ্ধতিটি ব্যবহৃত হয়। কেবল এই পদ্ধতিটি আপনার শ্রেণিতে রাখুন এবং কল লগের তালিকা পান।

এটা পরীক্ষা করো

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();

    }

আউটপুট চেহারা

এখানে চিত্র বর্ণনা লিখুন


পরিচালিত কুইকারিতে আমি ত্রুটি পাচ্ছি (কললগ। কলস alls কন্টিজুরি, নাল, নাল, নাল, নাল);
সুনীল পরমার

4
আমি কন্টেন্টসেসলভার.কোওয়ারি (কললগ.কলস.কন্টিজুরি, নাল, নাল, নাল, নাল) ব্যবহার করেছি;
সুনীল পরমার

@ দ্বিবেদী জি - এটি কিছুটা পুরানো পোস্ট - আপনার পদ্ধতিটি কাজ করে তবে আমার সমস্ত কল লগ লোড হতে কমপক্ষে 10 সেকেন্ড সময় লাগছে।
TheDevMan

@ দেদেভান, আপনার অসুবিধার জন্য দুঃখিত, হ্যাঁ আপনি ঠিক বলেছেন, আমি খুব শীঘ্রই আমার উত্তর আপডেট করব,
দ্বিবেদী জি

ধন্যবাদ আমি আপনার জবাবের জন্য অপেক্ষা করব!
TheDevMan

48

প্রসঙ্গ সহ যে কোনও জায়গা থেকে এই পদ্ধতিটি ব্যবহার করুন

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();
}

7
যেহেতু ম্যানেজডকুইয়ারি এখন অবচয় করা হয়েছে তাই এই উত্তরটি সবচেয়ে প্রাসঙ্গিক।
অভি

16

এই পোস্টটি কিছুটা পুরাতন তবে 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

আশা করি এটিও সহায়তা করেছে :)


আরে, আমি আপনার সমাধানটি পরীক্ষা করেছিলাম, ভাল it আমি যে সমস্যার মুখোমুখি হচ্ছি তা হ'ল কীভাবে আমার গ্রহন প্রকল্পে নির্ভরতা যুক্ত করবেন?
আরাধনা

@ আরধনা গ্রন্থাগারটি গ্রেড ব্যবহার করছে এবং এটি অ্যান্ড্রয়েড স্টুডিও থেকে নির্মিত হয়েছিল। আমি মনে করি, এটি আপনাকে গ্রহন করে চালানোর জন্য এটিকে কিছুটা পরিবর্তন করতে হবে
sromku

9

আমার প্রকল্পে আমি ত্রুটি পেয়ে যাচ্ছি এইচটিসি ডিভাইস 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();
    }

}

3

ইনকামিং, আউটগোয়িং এবং মিস কল ইতিহাস পেতে, আশা করি এই কোডটি আপনাকে সহায়তা করবে :)

আপনার পটভূমির থ্রেডে এই কোডটি কল করুন।

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----------------------------------");

2

কেবলমাত্র আগত কল ইতিহাস পেতে, নীচের কোডটি আপনাকে সহায়তা করবে :)

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();
} 

1

নীচে কোড ব্যবহার করুন:

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));




    }

0

যদি আমরা কোটলিন ব্যবহার করি তবে এটি খাটো। শ্রেণীর উদাহরণ যা কল লগ সরবরাহের জন্য প্রতিক্রিয়া জানায়:

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
}

0

আপনার কল করার জন্য লগ পড়ুন বা এসএমএসের অনুমতিগুলি পড়ার বিবেচনা করার আগে আমি আপনাকে গুগল প্লে মার্কেটের এই নীতিটি একবার দেখার জন্য দৃ strongly়ভাবে পরামর্শ দিচ্ছি: https://support.google.com/googleplay/android-developer/answer/9047303 ? এইচএল = এন

এই অনুমতিগুলি খুব সংবেদনশীল এবং আপনাকে প্রমাণ করতে হবে যে আপনার অ্যাপ্লিকেশনটি তাদের প্রয়োজন। তবে এমনকি যদি তাদের সত্যই এটি প্রয়োজন হয় তবে গুগল প্লে সমর্থন টিম যথাযথ ব্যাখ্যা ছাড়াই আপনার অনুরোধটি সহজেই প্রত্যাখ্যান করতে পারে।

এই আমার ঘটেছে কি। আমার আবেদনের বিক্ষোভ ভিডিও সহ সমস্ত প্রয়োজনীয় তথ্য সরবরাহ করার পরে আমার "অ্যাকাউন্টটি আমার অ্যাপ্লিকেশনটিতে নির্দিষ্ট ব্যবহারের কেস সমাধান দেওয়ার জন্য অনুমোদিত নয়" এই ব্যাখ্যা দিয়ে প্রত্যাখ্যান করা হয়েছিল (তারা ব্যবহারের কেসগুলির তালিকা যা তারা ব্যতিক্রম হিসাবে বিবেচনা করতে পারে) নীতি পৃষ্ঠাতে তালিকাভুক্ত)। কোনও নীতিগত বিবৃতিতে কোনও লিঙ্ক সরবরাহ করা হয়নি এটির অর্থ কী তা বোঝাতে। মূলত তারা আমার ব্যাখ্যাকে যথাযথ ব্যাখ্যা ব্যতিরেকে না গিয়ে বিচার করেছেন।

আমি আপনার অ্যাপ্লিকেশন ছেলেদের জন্য ভাল ভাগ্য কামনা করি তবে সাবধান হন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.