Search code examples
xamarinxamarin.androidxamarin.formsxamarin-studio

Reading Sim Number in Dual Sim Phone Xamarin.Form


Im always getting an error of Java.Lang.SecurityException: getLine1NumberForDisplay: Neither user 10710 nor current process has android.permission.READ_SMS. Even if I already Added the READ_SMS in AndroidManifest.xml

MyCode:

public string GetNumber()
{
    TelephonyManager telephonyManager = (TelephonyManager)GetSystemService(TelephonyService);
    return telephonyManager.Line1Number;
}

Thanks in Advance and Good Day :D


Solution

  • This is a really simple runtime permission request example.

    I would highly recommend reading the Xamarin blog post and the Android doc linked below as you should show the user "why" you are requesting permission before the system dialog shows up.

    [Activity(Label = "RunTimePermissions", MainLauncher = true, Icon = "@mipmap/icon")]
    public class MainActivity : Activity
    {
        const int PermissionSMSRequestCode = 99;
    
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            SetContentView(Resource.Layout.Main);
    
            Button button = FindViewById<Button>(Resource.Id.myButton);
            button.Click += delegate { 
                if ((int)Build.VERSION.SdkInt < 23) // Permissions accepted by the user during app install
                    DoSomeWork();
    
                var permission = BaseContext.CheckSelfPermission(Manifest.Permission.ReadSms);
                if (permission == Android.Content.PM.Permission.Granted) // Did the user already grant permission?
                    DoSomeWork();
                else // Ask the user to allow/deny permission request
                    RequestPermissions(new string[] { Manifest.Permission.ReadSms }, PermissionSMSRequestCode);
            };
        }
    
        public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Android.Content.PM.Permission[] grantResults)
        {
            base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
            if (requestCode == PermissionSMSRequestCode)
            {
                if ((grantResults.Count() > 0) && (grantResults[0] == Android.Content.PM.Permission.Granted))
                    DoSomeWork();
                else
                    Log.Debug("PERM", "The user denied access!");
            }
        }
    
        protected void DoSomeWork()
        {
            Log.Debug("PERM", "We have permission, so do something with it");
        }
    }
    

    enter image description here

    Ref: Requesting Runtime Permissions in Android Marshmallow

    Ref: Requesting Permissions at Run Time