如何在xamarin表单中检索双sim卡中的电话号码和IMEI?
我需要从sim卡中检索IMEI号码和电话号码。我已成功从sim卡中获取IMEI号码。但无法检索电话号码。它在使用电话管理器行号时显示为空。有人知道其他一些获取电话号码信息的方法吗?我正在使用上述代码:如何在xamarin表单中检索双sim卡中的电话号码和IMEI?,xamarin,xamarin.forms,xamarin.android,xamarin.ios,Xamarin,Xamarin.forms,Xamarin.android,Xamarin.ios,我需要从sim卡中检索IMEI号码和电话号码。我已成功从sim卡中获取IMEI号码。但无法检索电话号码。它在使用电话管理器行号时显示为空。有人知道其他一些获取电话号码信息的方法吗?我正在使用上述代码: if (Android.Support.V4.Content.ContextCompat.CheckSelfPermission(this, Manifest.Permission.ReadSms) != Android.Content.PM.Permission.Granted &&am
if (Android.Support.V4.Content.ContextCompat.CheckSelfPermission(this, Manifest.Permission.ReadSms) != Android.Content.PM.Permission.Granted &&
Android.Support.V4.Content.ContextCompat.CheckSelfPermission(this, Manifest.Permission.ReadPhoneNumbers) !=
Android.Content.PM.Permission.Granted && Android.Support.V4.Content.ContextCompat.CheckSelfPermission(this,
Manifest.Permission.ReadPhoneState) != Android.Content.PM.Permission.Granted && Android.Support.V4.Content.ContextCompat.CheckSelfPermission(this, Manifest.Permission.AccessCoarseLocation) != Android.Content.PM.Permission.Granted)
{
RequestPermissions(new String[] { Manifest.Permission.ReadPhoneState, Manifest.Permission.ReadPhoneNumbers, Manifest.Permission.ReadSms,Manifest.Permission.AccessCoarseLocation }, PERMISSIONS_REQUEST_READ_PHONE_STATE);
}
else
{
setDeviceImei();
}
您必须记住,Xamarin移动开发基本上是使用C#的本地开发,因此您受到与使用本地语言构建应用程序的开发人员类似的限制(iOS的Obj-C,Android的Java) iOS 苹果公司有非常强大的隐私保护功能,因此他们不允许应用程序“窃取”任何可能对设备/用户造成独特影响的信息。因此,无法直接从设备获取或。您可以在测试时使用“私有API”来获取它,但该应用程序将在审查过程中被拒绝,因此这是没有用的 但是,有一种“合法”的方法可以捕获电话号码,而无需输入任何尚未被阻止的用户数据,如: 其想法是让应用程序以编程方式向用户发送SMS消息 具有应用程序唯一安装代码的服务器。然后,该应用程序可以进行查询 查看同一服务器最近是否收到来自的SMS消息 具有此唯一应用程序安装代码的设备。如果有,它可以 阅读发送它的电话号码。下面是一个演示过程的示例。尽你所能 看,它就像一个符咒 Android 你已经知道IMEI号码了。对于电话号码,没有可靠的方法,尽管您可以使用与上述iOS相同的方法。以下是:
- 确保在您尝试过的代码中添加了权限READ\u PHONE\u STATE:
- 如果不起作用,请尝试添加权限
&READ_CONTACTS
,并使用Android.Provider添加READ_PROFILE
代码>与此代码一起:
var uri=ContactsContract.Contacts.ContentUri;
string[]projection={ContactsContract.Contacts.InterfaceConsts.Id,ContactsContract.CommonDataKinds.Phone.Number};
var cursor=ContentResolver.Query(uri、投影、null、null、null);
var contactList=新列表();
if(cursor.MoveToFirst())
{
做
{
如果(!cursor.MoveToNext())
打破
var phoneNumber=cursor.GetString(4);//这是用户的电话#
}虽然(正确);
}
这个用例是什么?我可能会为您推荐一个更好的解决方案。您好,我相信android很快就会限制您获得IMEI。最好准备一下,看看这个
private void setDeviceImei()
{
var tMgr = (TelephonyManager)Forms.Context.ApplicationContext.GetSystemService(Android.Content.Context.TelephonyService);
Console.WriteLine(tMgr.Line1Number);
//string deviceId = getDeviceID(telephonyManager,0);
//string deviceId1 = getDeviceID(telephonyManager, 1);
String imeiNumber1 = tMgr.GetDeviceId(0); //(API level 23)
String imeiNumber2 = tMgr.GetDeviceId(1);
Console.WriteLine(imeiNumber1, imeiNumber2);
SubscriptionManager smgr = (SubscriptionManager)GetSystemService(TelephonySubscriptionService);
SubscriptionInfo sim1 = smgr.GetActiveSubscriptionInfoForSimSlotIndex(0);
SubscriptionInfo sim2 = smgr.GetActiveSubscriptionInfoForSimSlotIndex(1);
Console.WriteLine(sim1);
Console.WriteLine(sim2);
}
var uri = ContactsContract.Contacts.ContentUri;
string[] projection = { ContactsContract.Contacts.InterfaceConsts.Id, ContactsContract.CommonDataKinds.Phone.Number };
var cursor = ContentResolver.Query(uri, projection, null, null, null);
var contactList = new List<string>();
if (cursor.MoveToFirst())
{
do
{
if (!cursor.MoveToNext())
break;
var phoneNumber = cursor.GetString(4); // This is the user's phone#
} while (true);
}