Как получить имя сим-карты для элемента журнала вызовов в Android?
Я пытаюсь получить имя сима для каждого журнала вызовов, как этот:
Uri URI_PHONE = CallLog.Calls.CONTENT_URI;
String SELECTION_PHONE = CallLog.Calls.NUMBER + "=?";
String[] SELECTION_ARRAY_PHONE = new String[]{phNum};
if (ActivityCompat.checkSelfPermission(getContext(), android.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.
Toast.makeText(getContext(), "Grant Permission First", Toast.LENGTH_SHORT).show();
}
Cursor currLogs = getContext().getContentResolver().query(URI_PHONE, null, SELECTION_PHONE, SELECTION_ARRAY_PHONE, CallLog.Calls.DATE + " DESC;");
int duration = currLogs.getColumnIndex(CallLog.Calls.DURATION);
int acountName = currLogs.getColumnIndex(CallLog.Calls.PHONE_ACCOUNT_ID);
int date = currLogs.getColumnIndex(CallLog.Calls.DATE);
int type = currLogs.getColumnIndex(CallLog.Calls.TYPE);
if (currLogs.getCount()>0) {
while (currLogs.moveToNext()) {
String talkedFor = currLogs.getString(duration);
String acount = currLogs.getString(acountName);
String dt = currLogs.getString(date);
String calltp = currLogs.getString(type);
int tp = Integer.parseInt(calltp);
Drawable drawableType = null;
switch (tp) {
case CallLog.Calls.OUTGOING_TYPE:
drawableType = out;
break;
case CallLog.Calls.INCOMING_TYPE:
drawableType = in;
break;
case CallLog.Calls.MISSED_TYPE:
drawableType = missed;
break;
}
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP_MR1) {
SubscriptionManager subscriptionManager = (SubscriptionManager) getContext().getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE);
List<SubscriptionInfo> subscriptionInfoList = null;
subscriptionInfoList = subscriptionManager.getActiveSubscriptionInfoList();
if (subscriptionInfoList != null && subscriptionInfoList.size() > 0) {
for (SubscriptionInfo info : subscriptionInfoList) {
String carrierName = String.valueOf(info.getDisplayName());
String mobileNo = info.getNumber();
String countyIso = info.getCountryIso();
String id = info.getIccId();
int dataRoaming = info.getDataRoaming();
if (id.equals(acount)) {
if (carrierName.isEmpty()){
simCardName = (String) info.getDisplayName();
}else {
simCardName = carrierName;
break;
}
}
}
}
}
callLogsMore.add(new CallsDetailsModel(talkedFor, drawableType,simCardName, dt));
}
}
Я тестировал этот код на Lenovo A7700 под управлением Android 6.1, и он работал нормально, но при тестировании на других устройствах, таких как Redmi Note 4, он показывал пустое имя. Я также попробовал решение для управления телефонией, но оно не работало в моем телефоне (Lenovo A7700), поэтому я выбрал эту процедуру.
Я думаю, что решение связано с CallLogs.Calls.PHONE_ACCOUNT_COMPONENT_NAME
, при запросе это возвращает длинное строковое значение.
Пожалуйста, помогите мне. Я застрял здесь больше месяца.