5

Tutaj próbuję uzyskać historię ostatniego połączenia w mojej aplikacji po zakończeniu połączenia z wydaniem apk (Published on play store as public app). Teraz wydali moją aplikację jako private app dla jednej organizacji nie jestem w stanie uzyskać dziennika połączeń historię w moim prywatnym aplikacjiJak uzyskać historię rejestrów połączeń telefonicznych profilu pracy organizacji w mojej aplikacji (opublikowanej jako aplikacja prywatna)

Aby zadzwonić zalogować Historia I opracowali kod jak poniżej:

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

Odpowiedz

1

Przegląd:

Gdy próbuje zadzwonić lub wysłać SMS-Work Contacts, jeden jest pierwszy przedstawiony z komunikatem:

używasz tej aplikacji zewnętrznej o f twój profil do pracy.

Można wtedy zadzwonić lub wysłać wiadomość tekstową, ale w wiadomości SMS lub w dzienniku połączeń będzie widoczny tylko numer telefonu kontaktowego i nie zostanie wyświetlona żadna nazwa.

Podobnie, podczas odbierania połączenia nie są wyświetlane żadne dane kontaktowe.

Przyczyna: telefon i SMS aplikacje są zaprojektowane i umieszczone w osobistym profilu i po aktywacji na Android for Work aplikacja Kontakty mieści się w profilu do pracy. Z powodu ograniczeń systemu Android 5.1.1 i wcześniejszych te dwa profile nie mogą się ze sobą komunikować, dlatego widoczny jest tylko numer telefonu. Dzieje się tak na każdym urządzeniu z Androidem, które nie jest specyficzne dla producenta. Aby uzyskać więcej informacji, zobacz:

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

Rozdzielczość: upgrade do Android 6.0 Marshmallow. W Android 6.0 MarshmallowGoogle ogłoszono ulepszenia dla kontaktów korporacyjnych. Wyświetlanie urządzeń z włączoną funkcją Android for Work Dane kontaktowe do pracy w aplikacjach osobistych i SMS-ach

Należy pamiętać, że dostęp do danych kontaktowych dotyczących pracy jest sprawdzany tylko w aplikacjach Google Phone i Google Messenger.

+0

Dziękuję za odpowiedź Chandrakant. Ale chcę uzyskać historię połączeń, a twoja odpowiedź ma na celu uzyskanie informacji kontaktowych. Tak więc moim problemem jest to, że nie mogę uzyskać logu połączeń i akcji Intent wywołania wychodzącego w broadcastReceiver. Zawsze odbieram przychodzący stan w broadcastReceiver, niezależnie od tego, czy wykonam połączenie, czy oddzwonię. –

+0

OK, wymyślę to i skontaktuję się z Tobą –

+0

Świetnie. Jeszcze raz dziękuję za pomoc. –

Powiązane problemy