如何在xamarin表单中检索双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

我需要从sim卡中检索IMEI号码和电话号码。我已成功从sim卡中获取IMEI号码。但无法检索电话号码。它在使用电话管理器行号时显示为空。有人知道其他一些获取电话号码信息的方法吗?我正在使用上述代码:

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
    &
    READ_PROFILE
    ,并使用Android.Provider添加
    与此代码一起:
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);
}