1

我正在尝试使用以下代码获取电话号码,

TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
phoneImei = tm.getDeviceId();
phoneNo = tm.getLine1Number();

但是,它返回空值。当我检查设置时,电话号码是未知的。我正在使用银河系。知道我该如何解决这个问题。?

4

7 回答 7

10

试试这个 :

  import android.app.Activity;  
  import android.content.Context;  
  import android.os.Bundle;  
  import android.telephony.TelephonyManager;  
  import android.util.Log;  
  import android.widget.Toast;  

  public class GetMyPhoneNoActivity extends Activity {  
   /** Called when the activity is first created. */  
   @Override  
   public void onCreate(Bundle savedInstanceState) {  
    super.onCreate(savedInstanceState);  
    setContentView(R.layout.main);          

    String number =getMyPhoneNO();  
    Toast.makeText(getApplicationContext(), "My Phone No is: "  
    +number, Toast.LENGTH_SHORT).show();  
    Log.v("Debug", number);          
   }  

private String getMyPhoneNO(){  
    TelephonyManager mTelephonyMgr;    
   mTelephonyMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);     

    String yourNumber = mTelephonyMgr.getLine1Number();  
 //return yourNumber;   
}       

}

在您的清单中:

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

这会很好地工作。

于 2012-09-20T11:08:33.990 回答
4

使用 SIM 卡序列号代替电话号码,该序列号始终存在并且始终是有效值。

   telephonyManager.getSimSerialNumber();

SIM 序列号至少在运营商内部是唯一的。所以结合

   telephonyManager.getNetworkOperator();

您将拥有一个国家/地区内订阅者的唯一标识符。这与

  telephonyManager.getNetworkCountryIso();

您将拥有订阅者的全球唯一标识符。

希望这会有所帮助。

干杯。

于 2012-09-20T11:54:59.723 回答
3

这是我的代码:

 import java.lang.reflect.Method;

 import android.app.NotificationManager;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.SharedPreferences;
 import android.database.Cursor;
 import android.media.AudioManager;
 import android.os.Bundle;
 import android.telephony.TelephonyManager;

 import com.android.internal.telephony.ITelephony;

  public class BlockBlackListIncomingNumber extends BroadcastReceiver {
 private Context cont;
 private Transactions transactions;
 private ITelephony itelephony;;

 int i = 1;


    /* When any incoming calls come to our cellphone number */
@Override
public void onReceive(Context context, Intent intent)
            {
    transactions = new Transactions(context); 
                // Create an object of transaction class.
    this.cont = context; 
                 // Refer to current object of Context.
    Bundle extras = intent.getExtras(); 
                 // Getting Bundles in extras.
    String iNumber = extras.getString(TelephonyManager.EXTRA_INCOMING_NUMBER); 
                 // Getting Incoming Number by which call comes that’s why we used TelephoyManager.EXTRA_INCOMING_NUMBER. 

iNumber 将是传入号码。

于 2012-09-20T10:56:00.937 回答
1

您需要在 AndroidManifest.xml 文件中添加以下权限

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
于 2012-09-20T10:45:22.443 回答
0

尝试使用 AIDL 实现 ITelephony 接口

于 2012-09-20T11:45:15.353 回答
0

在某些国家/地区,您不会使用您的代码获得电话号码

TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); phoneImei = tm.getDeviceId(); phoneNo = tm.getLine1Number();

您必须从用户那里获得输入。但是,要验证该号码,您需要在清单文件中包含发送 SMS 和接收 SMS 权限。

使用发送者和接收者的号码以及加密消息(您编写/编码)进行验证,您可以验证用户的电话号码。Whatsapp 就是这样做的。

于 2015-07-05T13:22:33.680 回答
0

如果您没有获得行号,您可以使用此代码

  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("phone", "Mobile_number " + info.getNumber());

                    }
                }
于 2020-01-19T06:15:00.410 回答