5

यहां मैं रिलीज एपीके (Published on play store as public app) के साथ कॉल समाप्त होने के बाद अपने आवेदन में अंतिम कॉल लॉग इतिहास प्राप्त करने का प्रयास कर रहा हूं। अब मैं एक संगठन के लिए private app के रूप में मेरे अनुप्रयोग जारी किया है मैं फोन मेरी निजी आवेदन के लिए लॉग इन इतिहास प्राप्त करने में सक्षम नहीं हूँ,मेरे आवेदन में संगठन कार्य प्रोफ़ाइल का फ़ोन कॉल लॉग इतिहास कैसे प्राप्त करें (निजी ऐप के रूप में प्रकाशित)

कॉल लॉग इतिहास मैं विकसित किया है के रूप में नीचे कोड प्राप्त करने के लिए:

public class CallLogListener extends BroadcastReceiver { 

    private String tag = "CallLogListener"; 
    History h; 
    Call call; 

    /** 
    * This method is called when BroadcastReceiver receive some action from another app 
    * 
    * @param mContext Context which is received by BroadcastReceiver 
    * @param i  Intent which is received by BroadcastReceiver 
    */ 
    @Override 
    public void onReceive(Context mContext, Intent i) { 
     // TODO Auto-generated method stub 
     try { 
      h = new History(new Handler(), mContext, "0"); 
      mContext.getContentResolver().registerContentObserver(CallLog.Calls.CONTENT_URI, true, h); 
      Bundle bundle = i.getExtras(); 
      if (bundle == null) 
       return; 
      SharedPreferences sp = mContext.getSharedPreferences(Constants.CallLogConstants.PREF_CALL_LOG, Activity.MODE_PRIVATE); 
      savePrefBoolean(mContext, mContext.getString(R.string.IS_PHONE_CALL_STATE_BUSY), true); 
      String s = bundle.getString(TelephonyManager.EXTRA_STATE); 

      if (i.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) { // call when call is in outgoing state 
       Calendar calendar = Calendar.getInstance(); 
       calendar.setTimeInMillis(System.currentTimeMillis()); 
       String number = i.getStringExtra(Intent.EXTRA_PHONE_NUMBER); 
       sp.edit().putString(Constants.DatabaseConstants.EXTRA_NUMBER, number).commit(); 
       sp.edit().putString(Constants.DatabaseConstants.EXTRA_STATE, "OutGoing Call").commit(); 
       sp.edit().putLong(Constants.DatabaseConstants.EXTRA_START_TIME, System.currentTimeMillis()).commit(); 
      } else if (s.equals(TelephonyManager.EXTRA_STATE_RINGING)) { // call when call is in incoming ringing state 
       String number = bundle.getString("incoming_number"); 
       sp.edit().putString(Constants.DatabaseConstants.EXTRA_NUMBER, number).commit(); 
       sp.edit().putString(Constants.DatabaseConstants.EXTRA_STATE, s).commit(); 
      } else if (s.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)) { // call when call is in offhook state 
       sp.edit().putString(Constants.DatabaseConstants.EXTRA_STATE, s).commit(); 
      } else if (s.equals(TelephonyManager.EXTRA_STATE_IDLE)) { // call when call is in idle state 
       savePrefBoolean(mContext, mContext.getString(R.string.IS_PHONE_CALL_STATE_BUSY), false); 
       String state = sp.getString(Constants.DatabaseConstants.EXTRA_STATE, null); 
       if (!state.equals(TelephonyManager.EXTRA_STATE_IDLE)) { 
        Calendar calendar = Calendar.getInstance(); 
        calendar.setTimeInMillis(System.currentTimeMillis()); 
        long temp = sp.getLong(Constants.DatabaseConstants.EXTRA_START_TIME, 0); 
        String duration = String.valueOf((temp - System.currentTimeMillis())/1000); 
        showLog(tag, "duration = " + duration, Constants.LogConstants.LOG_I, null); 
        duration = StringUtils.trim(duration.replaceAll("\\D+", "")); 
        sp.edit().putString(Constants.DatabaseConstants.EXTRA_STATE, null).commit(); 
        sp.edit().putLong(Constants.DatabaseConstants.EXTRA_START_TIME, 0).commit(); 
        sp.edit().putString("call_duration", duration).commit(); 
        h = new History(new Handler(), mContext, StringUtils.trim(duration.replaceAll("\\D+", ""))); 
        mContext.getContentResolver().registerContentObserver(CallLog.Calls.CONTENT_URI, true, h); 
       } 
       sp.edit().putString(Constants.DatabaseConstants.EXTRA_STATE, s).commit(); 
      } 
     } catch (Exception e) { 
      Crashlytics.logException(e); 
     } 
    } 
} 


public class History extends ContentObserver { 

    private String tag; // Tag 

    private Context mContext; 
    private Cursor managedCursor; 
    private boolean isCallEnd = false; 
    private String TotalCallDuration; 
    private CallInfo mCallInfo; 

    /** 
    * History is ContentObserver for call log 
    * 
    * @param handler activity handler 
    * @param cc  Context of an activity 
    * @param duration total call duration ringing time and actual talk time. 
    */ 
    public History(Handler handler, Context cc, String duration) { 
     // TODO Auto-generated constructor stub 
     super(handler); 
     tag = History.class.getSimpleName(); // Tag 
     mContext = cc; 
     this.TotalCallDuration = duration; 
    } 

    /** 
    * This is Overrided method of ContentObserver 
    * 
    * @return boolean where true or false 
    */ 
    @Override 
    public boolean deliverSelfNotifications() { 
     return true; 
    } 

    /** 
    * This is Overrided method of ContentObserver to check when call log is change 
    * 
    * @param selfChange to check if any thing change in call log 
    */ 
    @Override 
    public void onChange(boolean selfChange) { 
     // TODO Auto-generated method stub 
     super.onChange(selfChange); 
     try { 
      SharedPreferences sp = mContext.getSharedPreferences(Constants.CallLogConstants.PREF_CALL_LOG, Activity.MODE_PRIVATE); 
      String number = sp.getString(Constants.DatabaseConstants.EXTRA_NUMBER, null); 
      String timeDuration = sp.getString("call_duration", "0"); 
      if (number != null) { 
       getCalldetailsNow(timeDuration); 
       sp.edit().putString(Constants.DatabaseConstants.EXTRA_NUMBER, null).commit(); 
       sp.edit().putString("call_duration", "0").commit(); 
      } 
     } catch (Exception e) { 
      Crashlytics.logException(e); 
     } 
    } 

    /** 
    * Function to get call details using getContentResolver 
    * and store call information in database 
    * 
    * @throws Exception this will throws exception and handles in root method 
    */ 
    private void getCalldetailsNow(String timeDuration) throws Exception { 
     // TODO Auto-generated method stub 
     if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.READ_CALL_LOG) != PackageManager.PERMISSION_GRANTED) { 
      // TODO: Consider calling 
      // ActivityCompat#requestPermissions 
      // here to request the missing permissions, and then overriding 
      // public void onRequestPermissionsResult(int requestCode, String[] permissions, 
      //           int[] grantResults) 
      // to handle the case where the user grants the permission. See the documentation 
      // for ActivityCompat#requestPermissions for more details. 
      return; 
     } 
     managedCursor = mContext.getContentResolver().query(CallLog.Calls.CONTENT_URI, null, null, null, CallLog.Calls.DATE + " DESC"); 

     int number = managedCursor.getColumnIndex(CallLog.Calls.NUMBER); 
     int formatedNumber = managedCursor.getColumnIndex(CallLog.Calls.CACHED_FORMATTED_NUMBER); 
     int duration1 = managedCursor.getColumnIndex(CallLog.Calls.DURATION); 
     int type1 = managedCursor.getColumnIndex(CallLog.Calls.TYPE); 
     int date1 = managedCursor.getColumnIndex(CallLog.Calls.DATE); 

     boolean isMoveTofirst = managedCursor.moveToFirst(); 
     showToast(mContext, "12 :: managedCursor.moveToFirst() " + isMoveTofirst); 
     if (isMoveTofirst == true) { 
      String phNumber = managedCursor.getString(number); 
      String phFormatedNumber = managedCursor.getString(formatedNumber); 
      String strCallDuration; 
      strCallDuration = managedCursor.getString(duration1); 
      String callAnswered = strCallDuration.equalsIgnoreCase("0") ? Constants.CallHistoryListConstants.CALL_STATE_NOT_ANSWERED : Constants.CallHistoryListConstants.CALL_STATE_ANSWERED; 

      String type = managedCursor.getString(type1); 
      showToast(mContext, "13 :: type " + type); 
      String date = managedCursor.getString(date1); 
      CommonUtils.showLog(tag, "date = " + date, Constants.LogConstants.LOG_E, null); 

      String dir = null; 
      int dircode = Integer.parseInt(type); 
      switch (dircode) { 
       case CallLog.Calls.OUTGOING_TYPE: 
        dir = "OUTGOING"; 
        isCallEnd = true; 
        break; 
       case CallLog.Calls.INCOMING_TYPE: 
        dir = "INCOMING"; 
        timeDuration = strCallDuration; 
        isCallEnd = true; 
        break; 
       default: 
        dir = "INCOMING"; 
        callAnswered = "MISSED"; 
        timeDuration = "0"; 
        isCallEnd = true; 
        break; 
      } 

      SimpleDateFormat sdf_date = new SimpleDateFormat("dd-M-yyyy", Locale.ENGLISH); 
      SimpleDateFormat sdf_time = new SimpleDateFormat("HH:mm:ss", Locale.ENGLISH); 
      // SimpleDateFormat sdf_dur = new SimpleDateFormat("KK:mm:ss"); 

      String dateString = sdf_date.format(new Date(Long.parseLong(date))); 
      String timeString = sdf_time.format(new Date(Long.parseLong(date))); 

      showLog(tag, "History.java :: phoneCallTalkTme = " + timeDuration, Constants.LogConstants.LOG_E, null); 
      if (isCallEnd) { 
       // create object of sugar orm module class and store data in local databse 
       mCallInfo = new CallInfo(); // create object of call info table 
       mCallInfo.setNumber(phNumber); // set number 
       mCallInfo.setDate(dateString); // set date 
       mCallInfo.setTime(timeString.replace(".", "")); // set time 
       mCallInfo.setDuration(timeDuration); // set duration 
       mCallInfo.setCallState(callAnswered); // set call state 
       mCallInfo.setType(dir); // set call type 
       mCallInfo.save(); 

       savePrefString(mContext, mContext.getString(R.string.BUNDLE_LAST_CALL_DURATION), timeDuration); 
       savePrefString(mContext, mContext.getString(R.string.BUNDLE_LAST_CALL_TYPE), dir); 
       savePrefString(mContext, mContext.getString(R.string.BUNDLE_LAST_CALL_STATUS), callAnswered); 
       savePrefString(mContext, mContext.getString(R.string.BUNDLE_LAST_CALL_DATE), dateString + " " + timeString.replace(".", "")); 
      } 
     } 
     managedCursor.close(); 
    } 
} 

उत्तर

1

अवलोकन:

आप ओ के बाहर इस एप्लिकेशन का उपयोग कर रहे हैं:

जब फोन या संपर्क काम करने के लिए एसएमएस भेजने के लिए कोशिश कर रहा है, तो पहले एक संदेश के साथ प्रस्तुत किया है एफ आपके काम प्रोफाइल।

कोई तब संपर्क को कॉल या टेक्स्ट करने में सक्षम है, हालांकि एसएमएस संदेश या कॉल लॉग केवल संपर्क फोन नंबर दिखाएगा और कोई नाम प्रदर्शित नहीं होगा।

इसी तरह, कॉल प्राप्त करते समय कोई संपर्क विवरण प्रदर्शित नहीं होता है।

कारण: फ़ोन और SMS क्षुधा तैयार कर रहे हैं और व्यक्तिगत प्रोफाइल में रखे और जब कार्य के लिए Android पर सक्रिय संपर्क एप्लिकेशन कार्य प्रोफ़ाइल में स्थित है। एंड्रॉइड 5.1.1 में सीमाओं के कारण और इससे पहले ये दो प्रोफाइल एक दूसरे के साथ संवाद नहीं कर सकते हैं, इस प्रकार केवल फोन नंबर देखा जाता है। ऐसा किसी भी एंड्रॉइड डिवाइस पर होता है जो निर्माता के लिए विशिष्ट नहीं है। अधिक जानकारी के लिए, कृपया देखें:

https://support.google.com/work/android/answer/6275589?hl=en 

समाधान: Android 6.0 Marshmallow में अपग्रेड करें। Android 6.0 MarshmallowGoogle में एंटरप्राइज़ संपर्कों के लिए सुधार की घोषणा की गई थी। एंड्रॉइड फॉर वर्क सक्रिय डिवाइस व्यक्तिगत फोन और एसएमएस ऐप्स पर कार्य संपर्क जानकारी प्रदर्शित करते हैं

ध्यान दें कि कार्य संपर्क जानकारी तक पहुंचने की क्षमता केवल Google के फ़ोन और Google के मैसेंजर एप्लिकेशन में उपलब्ध है।

+0

चंद्रकांत के उत्तर के लिए धन्यवाद। लेकिन मैं कॉल लॉग इतिहास प्राप्त करना चाहता हूं और आपका उत्तर संपर्क जानकारी प्राप्त करने वाला है। तो मेरी समस्या यह है कि मैं ब्रॉडकास्ट रिसीवर में आउटगोइंग कॉल के कॉल लॉग और इरादे की कार्रवाई नहीं कर सकता। मैं हमेशा प्रसारणकर्ता में आने वाले प्रकार का राज्य प्राप्त करता हूं चाहे मैं कॉल करता हूं या कॉल प्राप्त करता हूं। –

+0

ठीक है, मैं इसे समझूंगा और आपको वापस ले जाऊंगा –

+0

ग्रेट। एक बार फिर मदद के लिए धन्यवाद। –

संबंधित मुद्दे