दिलचस्प पोस्ट
किसी भी समय SAX के साथ XML दस्तावेज़ को पार्स करने के लिए कैसे रोकें? RegisterStartupScript ScriptManager, Updatepanel के साथ काम नहीं करता है ऐसा क्यों है? जीपीआरएफ के विकल्प आईई 10 उपयोगकर्ता-एजेंट एसएपी.नेट का कारण बनता है सेट-कुकी को नहीं भेजना (आईई 10 कुकीज़ सेट नहीं करना) NSUserDefaults सिंक्रनाइज़-विधि छोटे 2 डी सरणियों में स्लाइस 2 डी सरणी क्या JSON को .asmx वेब सेवा से वापस लौटा सकता हूं यदि ContentType JSON नहीं है? अजगर का क्या अर्थ है पायथन में? getActionBar () नल रिटर्न (AppCompat-v7 21) किसी अन्य प्रोजेक्ट के स्प्रिंग- config.xml में स्प्रिंग- config.xml एक प्रोजेक्ट को कैसे आयात करें? असाइनमेंट स्टेटमेंट क्यों एक मान लौटाते हैं? इंटरनेट एक्सप्लोरर 9 तालिका कोशिकाओं को ठीक से प्रतिपादित नहीं करता है अजगर threading.timer – दोहराना फ़ंक्शन प्रत्येक 'एन' सेकंड एसक्यूएल इंजेक्शन हमले की रोकथाम: मैं कहाँ शुरू करूँ? अजगर में स्ट्रिंग से एएनएसआई एस्केप सीक्वेंस को मैं कैसे निकाल सकता हूं I

एंड्रॉइड: फोन दोहरी सिम है या नहीं यह जांचें

मंचों पर बहुत सारे शोध के बाद, अब मुझे पता है कि दो सिम कार्ड (निर्माता से संपर्क करने के अलावा) में सिम कार्ड दोनों के लिए आईएमएसआई या सिम सीरियल नंबर खोजने का कोई रास्ता नहीं है। अब मेरा बदला सवाल है, क्या हम सभी को पता लगा सकते हैं कि फोन में दो सिम हैं? मेरा मानना ​​है कि यह कुछ खुफिया जानकारी से पता लगा सकता है मेरे बारे में सोचने वाले कुछ तरीके हैं:

  1. एक यूएसएसडी कोड डायल करने और आईएमईआई नंबर के लिए लॉग को अनुरेखण (मैंने इसे भारत में * 13 9 # के साथ करने की कोशिश की। यह काम किया।) यह मुझे सिम के लिए आईएमईआई नंबर देगा, जिसमें से मैंने यूएसएसडी कोड को डायल किया था। (यह माना जाता है कि फोन एंड्रॉइड दिशानिर्देशों का पालन करता है और दो IMEI नंबर होते हैं।)

  2. सिम के लिए सिम सीरियल नंबर और / या आईएमएसआई को संग्रहीत करना और किसी भी अन्य आईएमएसआई / सीरियल नंबर का पता लगाने के बाद भी कुछ लॉग या कुछ प्रसारण ईवेंट हैंडलिंग द्वारा फोन रिबूट नहीं किया गया था (अर्थात सिम स्विच किया गया था)।

  3. * 06 # डायल करके आप आईएमईआई नंबर दोनों को देख सकेंगे। किसी तरह से, उन दो नंबर प्राप्त करें (पाठ के लिए स्क्रीन कैप्चरिंग और छवि पार्सिंग की तरह कुछ।)

अगर कोई अन्य तरीकों से सोच सकता है, तो उनका स्वागत है मैं इस बारे में किसी भी तरह की मदद की सराहना करता हूं इसके अलावा, अगर किसी के पास किसी भी निर्माता एपीआई या उनसे संपर्क करने के लिए लिंक के बारे में कोई जानकारी है, तो कृपया समुदाय के लोगों के साथ साझा करें।

वेब के समाधान से एकत्रित समाधान "एंड्रॉइड: फोन दोहरी सिम है या नहीं यह जांचें"

अपडेट 23 मार्च'15:

आधिकारिक बहु सिम एपीआई अब एंड्रॉइड 5.1 से उपलब्ध है

अन्य संभावित विकल्प:

IMEI नंबर प्राप्त करने के लिए आप जावा प्रतिबिंब का उपयोग कर सकते हैं

इन आईएमईआई नंबरों का उपयोग करके आप यह जांच सकते हैं कि फोन एक डुएल सिम है या नहीं।

निम्न गतिविधि का प्रयास करें:

import android.app.Activity; import android.os.Bundle; import android.widget.TextView; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TelephonyInfo telephonyInfo = TelephonyInfo.getInstance(this); String imeiSIM1 = telephonyInfo.getImsiSIM1(); String imeiSIM2 = telephonyInfo.getImsiSIM2(); boolean isSIM1Ready = telephonyInfo.isSIM1Ready(); boolean isSIM2Ready = telephonyInfo.isSIM2Ready(); boolean isDualSIM = telephonyInfo.isDualSIM(); TextView tv = (TextView) findViewById(R.id.tv); tv.setText(" IME1 : " + imeiSIM1 + "\n" + " IME2 : " + imeiSIM2 + "\n" + " IS DUAL SIM : " + isDualSIM + "\n" + " IS SIM1 READY : " + isSIM1Ready + "\n" + " IS SIM2 READY : " + isSIM2Ready + "\n"); } } 

और यहाँ TelephonyInfo.java :

 import java.lang.reflect.Method; import android.content.Context; import android.telephony.TelephonyManager; public final class TelephonyInfo { private static TelephonyInfo telephonyInfo; private String imeiSIM1; private String imeiSIM2; private boolean isSIM1Ready; private boolean isSIM2Ready; public String getImsiSIM1() { return imeiSIM1; } /*public static void setImsiSIM1(String imeiSIM1) { TelephonyInfo.imeiSIM1 = imeiSIM1; }*/ public String getImsiSIM2() { return imeiSIM2; } /*public static void setImsiSIM2(String imeiSIM2) { TelephonyInfo.imeiSIM2 = imeiSIM2; }*/ public boolean isSIM1Ready() { return isSIM1Ready; } /*public static void setSIM1Ready(boolean isSIM1Ready) { TelephonyInfo.isSIM1Ready = isSIM1Ready; }*/ public boolean isSIM2Ready() { return isSIM2Ready; } /*public static void setSIM2Ready(boolean isSIM2Ready) { TelephonyInfo.isSIM2Ready = isSIM2Ready; }*/ public boolean isDualSIM() { return imeiSIM2 != null; } private TelephonyInfo() { } public static TelephonyInfo getInstance(Context context){ if(telephonyInfo == null) { telephonyInfo = new TelephonyInfo(); TelephonyManager telephonyManager = ((TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE)); telephonyInfo.imeiSIM1 = telephonyManager.getDeviceId();; telephonyInfo.imeiSIM2 = null; try { telephonyInfo.imeiSIM1 = getDeviceIdBySlot(context, "getDeviceIdGemini", 0); telephonyInfo.imeiSIM2 = getDeviceIdBySlot(context, "getDeviceIdGemini", 1); } catch (GeminiMethodNotFoundException e) { e.printStackTrace(); try { telephonyInfo.imeiSIM1 = getDeviceIdBySlot(context, "getDeviceId", 0); telephonyInfo.imeiSIM2 = getDeviceIdBySlot(context, "getDeviceId", 1); } catch (GeminiMethodNotFoundException e1) { //Call here for next manufacturer's predicted method name if you wish e1.printStackTrace(); } } telephonyInfo.isSIM1Ready = telephonyManager.getSimState() == TelephonyManager.SIM_STATE_READY; telephonyInfo.isSIM2Ready = false; try { telephonyInfo.isSIM1Ready = getSIMStateBySlot(context, "getSimStateGemini", 0); telephonyInfo.isSIM2Ready = getSIMStateBySlot(context, "getSimStateGemini", 1); } catch (GeminiMethodNotFoundException e) { e.printStackTrace(); try { telephonyInfo.isSIM1Ready = getSIMStateBySlot(context, "getSimState", 0); telephonyInfo.isSIM2Ready = getSIMStateBySlot(context, "getSimState", 1); } catch (GeminiMethodNotFoundException e1) { //Call here for next manufacturer's predicted method name if you wish e1.printStackTrace(); } } } return telephonyInfo; } private static String getDeviceIdBySlot(Context context, String predictedMethodName, int slotID) throws GeminiMethodNotFoundException { String imei = null; TelephonyManager telephony = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); try{ Class<?> telephonyClass = Class.forName(telephony.getClass().getName()); Class<?>[] parameter = new Class[1]; parameter[0] = int.class; Method getSimID = telephonyClass.getMethod(predictedMethodName, parameter); Object[] obParameter = new Object[1]; obParameter[0] = slotID; Object ob_phone = getSimID.invoke(telephony, obParameter); if(ob_phone != null){ imei = ob_phone.toString(); } } catch (Exception e) { e.printStackTrace(); throw new GeminiMethodNotFoundException(predictedMethodName); } return imei; } private static boolean getSIMStateBySlot(Context context, String predictedMethodName, int slotID) throws GeminiMethodNotFoundException { boolean isReady = false; TelephonyManager telephony = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); try{ Class<?> telephonyClass = Class.forName(telephony.getClass().getName()); Class<?>[] parameter = new Class[1]; parameter[0] = int.class; Method getSimStateGemini = telephonyClass.getMethod(predictedMethodName, parameter); Object[] obParameter = new Object[1]; obParameter[0] = slotID; Object ob_phone = getSimStateGemini.invoke(telephony, obParameter); if(ob_phone != null){ int simState = Integer.parseInt(ob_phone.toString()); if(simState == TelephonyManager.SIM_STATE_READY){ isReady = true; } } } catch (Exception e) { e.printStackTrace(); throw new GeminiMethodNotFoundException(predictedMethodName); } return isReady; } private static class GeminiMethodNotFoundException extends Exception { private static final long serialVersionUID = -996812356902545308L; public GeminiMethodNotFoundException(String info) { super(info); } } } 

संपादित करें:

अन्य सिम स्लॉट के विस्तार के लिए "GetDeviceIdGemini" जैसे तरीकों की पहुंच प्राप्त करना भविष्यवाणी है कि विधि अस्तित्व में है।

अगर उस पद्धति का नाम डिवाइस निर्माता द्वारा दिए गए एक से मेल नहीं खाता है, तो यह काम नहीं करेगा। आपको उन उपकरणों के लिए इसी विधि का नाम ढूंढना होगा।

अन्य निर्माताओं के लिए विधि नाम ढूँढना निम्नानुसार जावा प्रतिबिंब का उपयोग किया जा सकता है:

 public static void printTelephonyManagerMethodNamesForThisDevice(Context context) { TelephonyManager telephony = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); Class<?> telephonyClass; try { telephonyClass = Class.forName(telephony.getClass().getName()); Method[] methods = telephonyClass.getMethods(); for (int idx = 0; idx < methods.length; idx++) { System.out.println("\n" + methods[idx] + " declared by " + methods[idx].getDeclaringClass()); } } catch (ClassNotFoundException e) { e.printStackTrace(); } } 

संपादित करें:

जैसा कि सेता ने अपनी टिप्पणी में बताया:

 telephonyInfo.imeiSIM1 = getDeviceIdBySlot(context, "getDeviceIdDs", 0); telephonyInfo.imeiSIM2 = getDeviceIdBySlot(context, "getDeviceIdDs", 1); 

यह उसके लिए काम कर रहा है सैमसंग Duos डिवाइस में दोनों सिम के लिए वह दो IMEI नंबर प्राप्त करने में सफल रही

जोड़ें <uses-permission android:name="android.permission.READ_PHONE_STATE" />

2 संपादित करें:

डेटा को पुनः प्राप्त करने के लिए इस्तेमाल की जाने वाली विधि, लिनोवो ए 3 9 9 और दूसरे निर्माण के लिए है (क्रेडिट माहेर अबुथ्रा ):

 telephonyInfo.imeiSIM1 = getDeviceIdBySlot(context, "getSimSerialNumberGemini", 0); telephonyInfo.imeiSIM2 = getDeviceIdBySlot(context, "getSimSerialNumberGemini", 1); 

मेरे पास एंड्रॉइड 4.4.4 के साथ एक सैमसंग ड्यूओस डिवाइस है और सीता द्वारा स्वीकृत जवाब (अर्थात कॉल getDeviceIdDs) द्वारा सुझाई गई विधि मेरे लिए काम नहीं करती, क्योंकि विधि मौजूद नहीं है। मैं नीचे दी गई विधि "getDefault (int slotID)" कॉलिंग पद्धति द्वारा आवश्यक सभी जानकारी को पुनर्प्राप्त करने में सक्षम था:

 public static void samsungTwoSims(Context context) { TelephonyManager telephony = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); try{ Class<?> telephonyClass = Class.forName(telephony.getClass().getName()); Class<?>[] parameter = new Class[1]; parameter[0] = int.class; Method getFirstMethod = telephonyClass.getMethod("getDefault", parameter); Log.d(TAG, getFirstMethod.toString()); Object[] obParameter = new Object[1]; obParameter[0] = 0; TelephonyManager first = (TelephonyManager) getFirstMethod.invoke(null, obParameter); Log.d(TAG, "Device Id: " + first.getDeviceId() + ", device status: " + first.getSimState() + ", operator: " + first.getNetworkOperator() + "/" + first.getNetworkOperatorName()); obParameter[0] = 1; TelephonyManager second = (TelephonyManager) getFirstMethod.invoke(null, obParameter); Log.d(TAG, "Device Id: " + second.getDeviceId() + ", device status: " + second.getSimState()+ ", operator: " + second.getNetworkOperator() + "/" + second.getNetworkOperatorName()); } catch (Exception e) { e.printStackTrace(); } } 

साथ ही, मैं उस कोड को दोबारा लिखता हूं जो कि रीथेट करने के तरीकों की जांच करता है ताकि वे इस जानकारी को पुनर्प्राप्त कर सकें, ताकि यह कोशिश / पकड़ के अनुक्रम के बजाय विधि नामों के सरणी का उपयोग कर सके। उदाहरण के लिए, यह निर्धारित करने के लिए कि हमारे पास दो सक्रिय सिम हैं जो हम कर सकते हैं:

 private static String[] simStatusMethodNames = {"getSimStateGemini", "getSimState"}; public static boolean hasTwoActiveSims(Context context) { boolean first = false, second = false; for (String methodName: simStatusMethodNames) { // try with sim 0 first try { first = getSIMStateBySlot(context, methodName, 0); // no exception thrown, means method exists second = getSIMStateBySlot(context, methodName, 1); return first && second; } catch (GeminiMethodNotFoundException e) { // method does not exist, nothing to do but test the next } } return false; } 

इस तरह, यदि कोई डिवाइस के लिए एक नया तरीका नाम सुझाया गया है, तो आप इसे सरणी में जोड़ सकते हैं और इसे काम करना चाहिए।

मैं IMEI के OnePlus 2 फोन से दोनों को पढ़ने में सक्षम हूं

  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // Call some material design APIs here TelephonyManager manager = (TelephonyManager) getActivity().getSystemService(Context.TELEPHONY_SERVICE); Log.i(TAG, "Single or Dula Sim " + manager.getPhoneCount()); Log.i(TAG, "Default device ID " + manager.getDeviceId()); Log.i(TAG, "Single 1 " + manager.getDeviceId(0)); Log.i(TAG, "Single 2 " + manager.getDeviceId(1)); } 

नेटवर्क ऑपरेटर की जांच के लिए खोज करते समय मैंने कई मूल समाधान प्राप्त किए हैं I

एपीआई के लिए> = 17:

 TelephonyManager manager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE); // Get information about all radio modules on device board // and check what you need by calling #getCellIdentity. final List<CellInfo> allCellInfo = manager.getAllCellInfo(); for (CellInfo cellInfo : allCellInfo) { if (cellInfo instanceof CellInfoGsm) { CellIdentityGsm cellIdentity = ((CellInfoGsm) cellInfo).getCellIdentity(); //TODO Use cellIdentity to check MCC/MNC code, for instance. } else if (cellInfo instanceof CellInfoWcdma) { CellIdentityWcdma cellIdentity = ((CellInfoWcdma) cellInfo).getCellIdentity(); } else if (cellInfo instanceof CellInfoLte) { CellIdentityLte cellIdentity = ((CellInfoLte) cellInfo).getCellIdentity(); } else if (cellInfo instanceof CellInfoCdma) { CellIdentityCdma cellIdentity = ((CellInfoCdma) cellInfo).getCellIdentity(); } } 

AndroidMinifest में अनुमति जोड़ें:

 <manifest xmlns:android="http://schemas.android.com/apk/res/android" <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> </manifest> 

नेटवर्क ऑपरेटर प्राप्त करने के लिए आप mcc और mnc कोड देख सकते हैं:

एपीआई के लिए> = 22:

 final SubscriptionManager subscriptionManager = SubscriptionManager.from(context); final List<SubscriptionInfo> activeSubscriptionInfoList = subscriptionManager.getActiveSubscriptionInfoList(); for (SubscriptionInfo subscriptionInfo : activeSubscriptionInfoList) { final CharSequence carrierName = subscriptionInfo.getCarrierName(); final CharSequence displayName = subscriptionInfo.getDisplayName(); final int mcc = subscriptionInfo.getMcc(); final int mnc = subscriptionInfo.getMnc(); final String subscriptionInfoNumber = subscriptionInfo.getNumber(); } 

एपीआई के लिए> = 23 सिर्फ दोहरे / ट्रिपल / कई सिम की जांच करें:

 TelephonyManager manager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE); if (manager.getPhoneCount() == 2) { // Dual sim } 

मैं कॉल लॉग पर एक नज़र रख रहा था और मैंने देखा कि प्रबंधित कैसर की सामग्री के अलावा, हमारे पास ड्यूएल सिम फोन में कॉलम "सिलीड" है (मैं एक्सो 3 ए लाइट लाइट पर चेक किया गया), ताकि प्रत्येक कॉल एक सिम के साथ कॉल लॉग में यह मान या तो 1 या 2 है, जो सबसे ज्यादा सिम 1 / सिम 2 को दर्शाता है।

 managedCursor = context.getContentResolver().query(contacts, null, null, null, null); managedCursor.moveToNext(); for(int i=0;i<managedCursor.getColumnCount();i++) {//for dual sim phones if(managedCursor.getColumnName(i).toLowerCase().equals("simid")) indexSIMID=i; } 

मुझे यह कॉलम एक सिम फोन में नहीं मिला (मैंने एक्सपेरिया एल पर चेक किया)

इसलिए हालांकि मुझे नहीं लगता कि यह दोहरी सिम प्रकृति की जांच करने का एक आसान तरीका है, मैं इसे यहां पोस्ट कर रहा हूं क्योंकि यह किसी के लिए उपयोगी हो सकता है

कॉमन्सवेयर का कहना है कि यह संभव नहीं है। कृपया निम्नलिखित देखें:

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

इस विषय पर आगे संवाद है:

Google देव दल का व्यक्ति कहता है कि एंड्रॉइड एसडीके का उपयोग कर ड्यूल सिम का पता लगाना संभव नहीं है।

सुझाव:

आप उपयोग करने का प्रयास कर सकते हैं

ctx.getSystemService("phone_msim")

के बजाय

ctx.getSystemService(Context.TELEPHONY_SERVICE)

यदि आपने पहले ही वैभव के उत्तर और telephony.getClass().getMethod() की कोशिश की है telephony.getClass().getMethod() विफल रहता है, ऊपर है जो मेरे क्वालकॉम मोबाइल के लिए काम करता है

मुझे सैमसंग एस 8 पर ये सिस्टम गुण मिले हैं

 SystemProperties.getInt("ro.multisim.simslotcount", 1) > 1 

इसके अलावा, स्रोत के अनुसार: https://android.googlesource.com/platform/frameworks/base/+/master/telephony/java/com/android/internal/telephony/TelephonyProperties.java

getprop persist.radio.multisim.config बहु सिम पर " dsds " या " dsda " रिटर्न

मैंने सैमसंग एस 8 पर इसका परीक्षण किया है और यह काम करता है