Android: Kiểm tra xem điện thoại có phải là hai SIM hay không


113

Sau rất nhiều tìm hiểu trên các diễn đàn, giờ tôi biết rằng không có cách nào để tìm IMSI hoặc số sê-ri SIM cho cả hai thẻ SIM trong điện thoại hai SIM (ngoại trừ liên hệ với nhà sản xuất). Bây giờ câu hỏi đã thay đổi của tôi là, liệu chúng ta có thể phát hiện ra rằng điện thoại có hai SIM không? Tôi tin rằng nó có thể được phát hiện với một số thông minh. Tôi có thể nghĩ ra vài cách là:

  1. Quay số mã USSD và truy tìm nhật ký cho số IMEI (Tôi đã thử điều này với * 139 # ở Ấn Độ. Nó hoạt động.) Thao tác này sẽ cung cấp cho tôi số IMEI cho SIM mà tôi đã quay số mã USSD từ đó. (Người ta cho rằng điện thoại tuân theo các nguyên tắc của Android và có hai số IMEI.)

  2. Lưu số sê-ri của SIM và / hoặc IMSI cho SIM. Và sau khi phát hiện bất kỳ số IMSI / Serial nào khác ngay cả khi điện thoại chưa được khởi động lại (tức là đã chuyển SIM) bằng cách truy tìm một số nhật ký hoặc bằng một số xử lý sự kiện phát sóng.

  3. Bằng cách quay số * 06 #, bạn sẽ thấy cả hai số IMEI. Bằng cách nào đó, hãy lấy hai con số đó. (Một cái gì đó như chụp màn hình và phân tích hình ảnh cho văn bản.)

Nếu bất cứ ai có thể nghĩ ra một số cách khác, họ được hoan nghênh nhất. Tôi thực sự sẽ đánh giá cao bất kỳ loại trợ giúp nào liên quan đến điều này. Ngoài ra, nếu bất kỳ ai có bất kỳ thông tin nào về bất kỳ API hoặc liên kết nào của nhà sản xuất để liên hệ với họ, vui lòng chia sẻ với cộng đồng.


Xin chào Rajkiran, Cuối cùng tôi đã nhận được giải pháp hoạt động tốt cho tôi. Hy vọng nó sẽ hữu ích cho tất cả những ai muốn xử lý Duel SIM trong các ứng dụng di động. API xử lý SIM đấu không được ghi lại. Vui lòng kiểm tra câu trả lời của tôi, nó hoạt động tốt cho tôi. stackoverflow.com/questions/17618651/…
Jebasuthan

1
Cảm ơn .. nhưng câu trả lời của bạn không trả lời câu hỏi của tôi. Tôi muốn biết tất cả thông tin chi tiết về SIM thứ hai và IMEI. Câu trả lời của @Pied Piper giúp tôi có được mọi thứ.
Rajkiran

Câu trả lời của @Rajkiran Pied Piper có thực sự giúp ích cho bạn? Tôi đã kiểm tra mã của anh ấy trong m samsung galaxy y duos nhưng nó không hoạt động. Bạn có thể giúp tôi tìm số IMEI của điện thoại hai sim được không?
Nitish Patel

@nitishpatel: Có chắc chắn nó đã giúp. Rất tiếc, tôi không có Y Duos để kiểm tra. Nhưng tôi tin rằng Samsung sử dụng cơ chế khác để xử lý SIM kép trên phiên bản Android 4.0 trở đi. Câu trả lời của Pied Pipers giúp ích cho các thiết bị 4.0 trở đi. Đối với phần còn lại, bạn sẽ cần tìm hiểu thêm một chút bằng cách sử dụng phản chiếu.
Rajkiran

Xin chào, tôi tìm thấy một giải pháp ... xin vui lòng mã kiểm tra stackoverflow.com/a/32304799/3131373 Nó được thử nghiệm trên nhiều điện thoại
user3131373

Câu trả lời:


184

Cập nhật ngày 23 tháng 3 '15:

API nhiều SIM chính thức hiện có sẵn từ Android 5.1 trở đi

Tùy chọn khả thi khác:

Bạn có thể sử dụng phản chiếu Java để lấy cả hai số IMEI.

Sử dụng các số IMEI này, bạn có thể kiểm tra xem điện thoại có phải là SIM KÉP hay không.

Hãy thử hoạt động sau:

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

Và đây là 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);
        }
    }
}

Biên tập :

Việc truy cập các phương thức như "getDeviceIdGemini" để biết thông tin chi tiết của khe cắm SIM khác có dự đoán rằng phương pháp tồn tại.

Nếu tên của phương thức đó không khớp với tên do nhà sản xuất thiết bị đưa ra thì nó sẽ không hoạt động. Bạn phải tìm tên phương thức tương ứng cho các thiết bị đó.

Việc tìm kiếm tên phương thức cho các nhà sản xuất khác có thể được thực hiện bằng cách sử dụng phản chiếu Java như sau:

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

BIÊN TẬP :

Như Seetha đã chỉ ra trong bình luận của cô ấy:

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

Nó đang làm việc cho cô ấy. Cô ấy đã thành công trong việc lấy hai số IMEI cho cả hai SIM trong thiết bị Samsung Duos.

Thêm vào <uses-permission android:name="android.permission.READ_PHONE_STATE" />

CHỈNH SỬA 2:

Phương pháp được sử dụng để truy xuất dữ liệu dành cho Lenovo A319 và các điện thoại khác của nhà sản xuất đó (Credit Maher Abuthraa ):

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

4
Mát mẻ! Điều đó đã làm việc cho tôi với "getDeviceId" trên Karbonn. Sẽ tìm kiếm các phương pháp của Samsung và sẽ cập nhật ở đây khi tôi có nó với tôi. Cảm ơn anh bạn. Thanh danh.
Rajkiran

1
Đúng. Ngay cả tôi đã làm điều đó. Nhận thấy rằng Samsung sử dụng com.android.internal.telephony.RILConstants$SimCardIDnội bộ. Thậm chí đã thử tạo lớp đó với cùng chữ ký của các phương thức và cùng tên của các biến. Nhưng không may mắn. Sẽ thử lấy mã nguồn và sẽ cố gắng kiểm tra. Cảm ơn.
Rajkiran

4
Tôi sử dụng telehonyInfo.imeiSIM1 = getDeviceIdBySlot (context, "getDeviceIdDs", 0); telehonyInfo.imeiSIM2 = getDeviceIdBySlot (context, "getDeviceIdDs", 1); Đó là làm việc cho tôi. Tôi đã thành công trong việc nhận được hai số IMEI cho cả hai SIM.
Seetha

1
Làm cách nào để lấy Số điện thoại của SIM2? Tôi nhận được số SIM1 sử dụng phương pháp telephony.getLine1Number (), trong danh sách các phương pháp tôi không thể tìm thấy phương pháp như getLine2Number () hoặc getLine1Number (int)
DCoder

4
deviceId là IMEI không phải IMSI, phải không?
falko

5

Tôi có thiết bị Samsung Duos chạy Android 4.4.4 và phương pháp do Seetha đề xuất trong câu trả lời được chấp nhận (tức là gọi getDeviceIdDs) không hoạt động với tôi, vì phương pháp này không tồn tại. Tôi đã có thể khôi phục tất cả thông tin tôi cần bằng cách gọi phương thức "getDefault (int slotID)", như được hiển thị bên dưới:

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

Ngoài ra, tôi đã viết lại mã kiểm tra lặp đi lặp lại các phương pháp để khôi phục thông tin này để nó sử dụng một mảng tên phương thức thay vì một chuỗi try / catch. Ví dụ, để xác định xem chúng ta có hai SIM đang hoạt động hay không, chúng ta có thể làm:

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

Bằng cách này, nếu một tên phương thức mới được đề xuất cho một số thiết bị, bạn có thể chỉ cần thêm nó vào mảng và nó sẽ hoạt động.


4

Có một số giải pháp gốc mà tôi đã tìm thấy trong khi tìm kiếm cách kiểm tra nhà khai thác mạng.

Đối với API> = 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();
    } 
}

Trong AndroidManifest, thêm quyền:

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

Để nhận nhà khai thác mạng, bạn có thể kiểm tra mã mcc và mnc:

Đối với API> = 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();
}

Đối với API> = 23. Để chỉ kiểm tra xem điện thoại có phải là sim kép / ba / nhiều không:

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

4

Tôi có thể đọc cả IMEI từ Điện thoại OnePlus 2

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                TelephonyManager manager = (TelephonyManager) getActivity().getSystemService(Context.TELEPHONY_SERVICE);
                Log.i(TAG, "Single or Dual 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));
            }

Tốt rằng nó hoạt động trên One Plus. Nhưng yêu cầu bạn bài trả lời mà làm việc cho tất cả điện thoại và tất cả các phiên bản android (có lẽ)
Rajkiran

1
Đây là một SDK chính thức. Sẽ hoạt động cho tất cả các điện thoại. Tôi đã thử nghiệm nó trên OnePlus 2
Swapnil Godambe

Vì vậy, câu trả lời được chấp nhận từ @Swapnil cũng nói lên điều tương tự phải không?
Rajkiran

2

Tôi đang xem nhật ký cuộc gọi và tôi nhận thấy rằng ngoài các trường thông thường trong nội dung của ManagedCursor, chúng tôi có một cột "simid" trong điện thoại Hai SIM (Tôi đã kiểm tra trên Xolo A500s Lite), để gắn thẻ mỗi cuộc gọi trong nhật ký cuộc gọi bằng SIM. Giá trị này là 1 hoặc 2, hầu hết có thể biểu thị SIM1 / SIM2.

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

Tôi không tìm thấy cột này trong điện thoại một SIM (tôi đã kiểm tra trên Xperia L).

Vì vậy, mặc dù tôi không nghĩ đây là cách dễ hiểu để kiểm tra tính chất SIM kép, nhưng tôi đăng nó ở đây vì nó có thể hữu ích cho ai đó.


Bạn đang đọc một DB, cái nào? Hãy làm rõ những gì bạn đang làm ở đây. (Đâu là "liên lạc" db lưu trữ?
not2qubit

1

Lời khuyên:

Bạn có thể thử sử dụng

ctx.getSystemService("phone_msim")

thay vì

ctx.getSystemService(Context.TELEPHONY_SERVICE)

Nếu bạn đã thử câu trả lời của Vaibhav và telephony.getClass().getMethod()không thành công, trên đây là những gì hoạt động cho điện thoại di động Qualcomm của tôi .


Miễn là câu trả lời hoàn tất, bạn có thể đăng liên kết đến các trang web bằng các ngôn ngữ khác để biết thêm thông tin. meta.stackoverflow.com/questions/271060/…
mach

Đó thực sự là một liên kết hữu ích , không cần phải xóa nó.
not2qubit

0

Tôi đã tìm thấy các thuộc tính hệ thống này trên Samsung S8

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

Ngoài ra, theo nguồn: https://android.googlesource.com/platform/frameworks/base/+/master/telephony/java/com/android/internal/telephony/TelephonyProperties.java

getprop persist.radio.multisim.configtrả về " dsds" hoặc " dsda" trên đa sim.

Tôi đã thử nghiệm điều này trên Samsung S8 và nó hoạt động


Đừng bận tâm. Android hiện đã có API cho hai SIM. developer.android.com/about/versions/android-5.1.html#multisim Đối với mọi thứ khác, bạn có thể tham khảo câu trả lời ở trên của @vaibhav
Rajkiran

-1

Commonsware nói rằng điều này là không thể. Vui lòng xem phần sau:

Không thể phát hiện hai SIM bằng Android SDK.

Đây là hộp thoại khác về chủ đề:

Nhân viên nhóm phát triển của Google cho biết không thể phát hiện SIM kép bằng Android SDK.


3
Vâng, anh bạn. Tôi biết điều đó. Nhưng đó là lý do tại sao tôi đang cố gắng tìm cách giải quyết. Và phải có một số. Hãy thử ứng dụng USSDDualWidget từ Cửa hàng Play. Nó thực sự có thể chuyển đổi giữa hai SIM. Thậm chí đã cố gắng để đảo ngược mã, nhưng không may mắn.
Rajkiran

Nó có hoạt động trên tất cả các thiết bị hay chỉ là một tập hợp con hạn chế để lộ một số loại giao diện độc quyền?
gonzobrains

2
Tại sao câu trả lời này bị phản đối? Đây là câu trả lời chính xác. ^
N Sharma

24
Đôi khi phần mềm chung đã nói rằng nó không thể , điều này đã được các nhà phát triển khác thực hiện. Vì vậy, nó không giống như những gì commonsware nói luôn luôn đúng :-)
Lalit Poptani

1
Bạn có thể đúng, nhưng tôi nghĩ anh ấy là một nguồn lực khá đáng tin cậy cho mọi thứ về Android. Đối với vấn đề cụ thể này, chắc chắn, tôi đã làm điều tương tự và sử dụng phản chiếu để lấy dữ liệu sim kép, nhưng đó là cho thiết bị cụ thể của tôi. Cho đến ngày nay, tôi vẫn không tin rằng có bất kỳ cách chung nào để làm điều này. Cũng lưu ý rằng tôi cũng đã trích dẫn một nhà phát triển của Google và không chỉ Commonsware.
gonzobrains
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.