【问题标题】:How to get simCard number in Android如何在 Android 中获取 simCard 号码
【发布时间】:2018-12-17 22:28:51
【问题描述】:

在我的应用程序中,我想从 sim 卡 获取 电话号码 并显示用户。
我写了下面的代码,但在模拟器中显示我的 sim 卡号,但某些设备如 Samsung 没有显示任何 sim 卡号。

清单代码:

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>

活动代码:

public class FetchSimActivity extends AppCompatActivity {

    TextView fetchSimCardTxt, fetchNumCardTxt;
    TelephonyManager tm;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_fetch_sim);
        fetchSimCardTxt = findViewById(R.id.fetchSimCardTxt);
        fetchNumCardTxt = findViewById(R.id.fetchNumCardTxt);
        tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != 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;
        }
        String simID = tm.getSimSerialNumber();
        if (simID != null) {
            fetchSimCardTxt.setText("SIM ID : + " + simID);
        }

        String telNumber = tm.getLine1Number();
        if (telNumber != null) {
            fetchNumCardTxt.setText("SIM NUM : + " +telNumber);
        }
    }
}

我如何从android中的所有设备获取sim卡号?

【问题讨论】:

标签: java android


【解决方案1】:

在 AndroidManifest.xml 中添加权限

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>

然后使用这段代码

import android.Manifest;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.widget.Toast;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {
    String TAG = "PhoneActivityTAG";
    Activity activity = MainActivity.this;
    String wantPermission = Manifest.permission.READ_PHONE_STATE;
    private static final int PERMISSION_REQUEST_CODE = 1;
    ArrayList<String> _mst=new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (!checkPermission(wantPermission)) {
            requestPermission(wantPermission);
        } else {

            Log.d(TAG, "Phone number: " + getPhone());
         _mst = getPhone();

            for (String op: _mst) {
               Log.i("Device Information", String.valueOf(op));
            }
        }
    }

    @TargetApi(Build.VERSION_CODES.O)
    private ArrayList<String> getPhone() {
        TelephonyManager phoneMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        if (ActivityCompat.checkSelfPermission(activity, wantPermission) != PackageManager.PERMISSION_GRANTED) {
            return null;
        }
        ArrayList<String> _lst =new ArrayList<>();
        _lst.add(String.valueOf(phoneMgr.getCallState()));
        _lst.add("IMEI NUMBER :-"+phoneMgr.getImei());
        _lst.add("MOBILE NUMBER :-"+phoneMgr.getLine1Number());
        _lst.add("SERIAL NUMBER :-"+phoneMgr.getSimSerialNumber());
        _lst.add("SIM OPERATOR NAME :-"+phoneMgr.getSimOperatorName());
        _lst.add("MEI NUMBER :-"+phoneMgr.getMeid());
        _lst.add("SIM STATE :-"+String.valueOf(phoneMgr.getSimState()));
        _lst.add("COUNTRY ISO :-"+phoneMgr.getSimCountryIso());
        return _lst;
    }

    private void requestPermission(String permission){
        if (ActivityCompat.shouldShowRequestPermissionRationale(activity, permission)){
            Toast.makeText(activity, "Phone state permission allows us to get phone number. Please allow it for additional functionality.", Toast.LENGTH_LONG).show();
        }
        ActivityCompat.requestPermissions(activity, new String[]{permission},PERMISSION_REQUEST_CODE);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
        switch (requestCode) {
            case PERMISSION_REQUEST_CODE:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    Log.d(TAG, "Phone number: " + getPhone());
                } else {
                    Toast.makeText(activity,"Permission Denied. We can't get phone number.", Toast.LENGTH_LONG).show();
                }
                break;
        }
    }

    private boolean checkPermission(String permission){
        if (Build.VERSION.SDK_INT >= 23) {
            int result = ContextCompat.checkSelfPermission(activity, permission);
            if (result == PackageManager.PERMISSION_GRANTED){
                return true;
            } else {
                return false;
            }
        } else {
            return true;
        }
    }
}

【讨论】:

  • 如果您在实现上述代码时遇到任何问题,请告诉我
  • 使用这段代码不使用ArrayList简单返回phoneMgr.getLine1Number();
  • 您的 Android 设备的 API 级别
  • 只在onCreate方法中使用这行代码。 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { List _sb = SubscriptionManager.from(getApplicationContext()).getActiveSubscriptionInfoList(); for (int i = 1; i
  • 我实现了相同的代码 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { List _sb = SubscriptionManager.from(getApplicationContext()).getActiveSubscriptionInfoList(); for (int i = 1; i
【解决方案2】:

使用此代码

public class MainActivity extends AppCompatActivity {
    String TAG = "PhoneActivityTAG";
    @SuppressLint("NewApi")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
             List<SubscriptionInfo> _sb = SubscriptionManager.from(getApplicationContext()).getActiveSubscriptionInfoList();
            for (int i = 1; i < _sb.size(); i++) {
                SubscriptionInfo info = _sb.get(i);
                Log.d(TAG, "Mobile_number " + info.getNumber());

            }
        }
    }
}

【讨论】:

  • mobile 使用的是哪个 api 级别(mobile sdk 版本)?
  • 是的,我用的是手机,android 版本是 7 (Android N)
  • 请换个手机。然后运行这段代码
  • 我在另一部手机(三星,Android 7)上测试。但再次显示 null!
  • 我的代码图片:ibb.co/hihAhT --- ibb.co/eoKCwo。请查看并帮助我。请
【解决方案3】:

onCreate 方法中。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    List<SubscriptionInfo> _sb = SubscriptionManager.from(getApplicationContext()).getActiveSubscriptionInfoList();
    for (int i = 1; i < _sb.size(); i++) {
        SubscriptionInfo info = _sb.get(i);
        Log.d(TAG, "Mobile_number " + info.getNumber());

    }
}

【讨论】:

  • 请试试这个代码。如果您遇到任何问题。请告诉我
  • 如何在 android 16 及更高版本中使用它?请帮帮我
  • 不运行此代码:Log.d(TAG, "Mobile_number" + info.getNumber()); .为什么?
【解决方案4】:

获取两个 sim 卡详细信息。

 if (SubscriptionManager.from(this).getActiveSubscriptionInfoCount() > 0) {
                ArrayList<String> _lst = new ArrayList<>();
                for (int i = 0; i < SubscriptionManager.from(this).getActiveSubscriptionInfoList().size(); i++) {
                    _lst.add("\n".concat(String.valueOf(phoneMgr.createForSubscriptionId(i).getCallState())));
                    _lst.add("\nIMEI NUMBER : " + phoneMgr.createForSubscriptionId(i).getImei());
                    _lst.add("\nMOBILE NUMBER : ".concat(phoneMgr.createForSubscriptionId(i).getLine1Number()));
                    _lst.add("\nSERIAL NUMBER : ".concat(phoneMgr.createForSubscriptionId(i).getSimSerialNumber()));
                    _lst.add("\nSIM OPERATOR NAME : " + phoneMgr.createForSubscriptionId(i).getSimOperatorName());
                    _lst.add("\nMEI NUMBER : " + phoneMgr.createForSubscriptionId(i).getMeid());
                    _lst.add("\nSIM STATE : ".concat(String.valueOf(phoneMgr.createForSubscriptionId(i).getSimState())));
                    _lst.add("\nCOUNTRY ISO : " + phoneMgr.createForSubscriptionId(i).getSimCountryIso());
                }
                return _lst;
            }

【讨论】:

  • 不显示电话号码。电话号码代码无效。
  • 不工作。手机号码不显示
猜你喜欢
  • 2014-04-16
  • 1970-01-01
  • 1970-01-01
  • 2013-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多