Intencje
--------
Intent (intencja, wzorzec projektowy Command) - obiekt przechowujący wszystkie dane niezbędne
do późniejszego uruchomienia polecenia - metodę i wartości jej parametrów. Dzięki temu można
je kolejkować.
Nowy projekt typu Visual C#, Android, Android App (Xamarin) o nazwie Intencje
Blank App, Android 5.0 (Lollipop)
Do projektu dodajemy drugą aktywność:
Project, Add New Item..., Visual C#, Activity -> Name: InnaAktywnosc (powstanie plik InnaAktywnosc.cs)
W folderze Resources, layout otwieramy menu kontekstowe: Add, New Item..., Android Layout (nazwa: activity_inna.axml) - pytanie: Trust
Do widoku dodajemy TextView:
Aby wykorzystać zaprojektowany widok przechodzimy do pliku InnaAktywnosc.cs i do metody onCreate wstawiamy wywołanie metody SetContentView:
namespace Intencje
{
[Activity(Label = "InnaAktywnosc")]
public class InnaAktywnosc : Activity
{
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.activity_inna);
}
}
}
W pierwszej aktywności MainActivity dodajemy przycisk:
Przechodzimy do Resources, layout, activity_main.axml
Aby stworzyć nasłuchiwacz dla przycisku modyfikujemy plik MainActivity.cs:
namespace Intencje
{
[Activity(Label = "@string/app_name", Theme = "@style/AppTheme", MainLauncher = true)]
public class MainActivity : AppCompatActivity
{
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
// Set our view from the "main" layout resource
SetContentView(Resource.Layout.activity_main);
Button przycisk = FindViewById(Resource.Id.przycisk);
przycisk.Click += Przycisk_Click;
}
private void Przycisk_Click(object sender, System.EventArgs e)
{
Intent i = new Intent(this, typeof(InnaAktywnosc));
//Finish();
StartActivity(i);
}
}
}
---------
Uruchamianie innej aktywności:
Intent i = new Intent(this, typeof(InnaAktywnosc));
//Finish();
StartActivity(i);
---------
Przeglądarka:
Intent i = new Intent(Intent.ActionView);
i.SetData(Android.Net.Uri.Parse("http://www.fizyka.umk.pl/~jacek/"));
StartActivity(i);
---------
Wyszukiwarka:
Intent i = new Intent(Intent.ActionWebSearch);
i.PutExtra(SearchManager.Query, "UMK");
StartActivity(i);
---------
Pokaż mapę z lokacją:
double latitude = 53.017100;
double longitude = 18.602889;
double zoom = 1.85; //wartości od 1 do 23
string uri = "geo:" + latitude.ToString() + "," + longitude.ToString() + "?z=" + zoom.ToString();
Intent i = new Intent(Intent.ActionView, Android.Net.Uri.Parse(uri));
StartActivity(i);
string uri = "geo:0,0?q=Torun Gagarina 11";
Intent i = new Intent(Intent.ActionView, Android.Net.Uri.Parse(uri));
StartActivity(i);
Zob. więcej w opisie https://docs.microsoft.com/pl-pl/xamarin/android/platform/maps-and-location/maps/maps-application
Tam m.in. Street View
---------
Inicjacja połączenia telefonicznego:
string numerTelefonu = "+48 123 456 789";
Intent i = new Intent(Intent.ActionCall);
i.SetData(Android.Net.Uri.Parse("tel:" + numerTelefonu));
StartActivity(i);
SecurityException! -> Dodajemy uprawnienie do dzwonienia:
Project, Intencje Properties..., Android Manifest (edytor do AndroidManifest.xml): Required permissions: CALL_PHONE
To zmieni manifest (Properties\AndroidManifest.xml)
<
/application>
Możliwość dzwonienia to niebezpieczne uprawnienie. Dlatego w nowszych wersjach Androida (>=23)
string numerTelefonu = "+48 123 456 789";
Intent i = new Intent(Intent.ActionCall);
i.SetData(Android.Net.Uri.Parse("tel:" + numerTelefonu));
if (ContextCompat.CheckSelfPermission(this, Android.Manifest.Permission.CallPhone) != Android.Content.PM.Permission.Granted)
{
ActivityCompat.RequestPermissions(this, new string[] { Android.Manifest.Permission.CallPhone }, 0); //, MY_PERMISSIONS_REQUEST_CALL_PHONE);
}
else
{
try
{
StartActivity(i);
}
catch (SecurityException _e)
{
_e.PrintStackTrace();
}
}
Trochę to usprawnimy:
Zdefiniujmy funkcję, której zadaniem będzie zdobycie odpowiednich uprawnień:
namespace Intencje
{
[Activity(Label = "@string/app_name", Theme = "@style/AppTheme", MainLauncher = true)]
public class MainActivity : AppCompatActivity
{
...
static private bool zdobądźUprawnienia(Activity activity, string permission, int requestCode)
{
//int permissionCheck = ContextCompat.checkSelfPermission(activity, android.Manifest.permission.READ_PHONE_STATE);
Permission permissionCheck = ContextCompat.CheckSelfPermission(activity, permission);
if (permissionCheck != Permission.Granted)
{
ActivityCompat.RequestPermissions(
activity,
new string[] { permission },
//requestReadPhoneState);
requestCode);
return false;
}
else return true;
}
Zmieniony kod odpowiedzialny za inicjację połączenia:
try
{
string numerTelefonu = "+48 123 456 789";
if (zdobądźUprawnienia(this, Manifest.Permission.CallPhone, 0))
{
Intent i = new Intent(Intent.ActionCall);
i.SetData(Android.Net.Uri.Parse("tel:" + numerTelefonu));
StartActivity(i);
}
else Toast.MakeText(ApplicationContext, "Brak uprawnień", ToastLength.Long).Show();
}
catch (Java.Lang.SecurityException exc)
{
Toast.MakeText(ApplicationContext, exc.Message, ToastLength.Long).Show();
}
Dzwonienie bez pobierania uprawnień (pokazane zostanie okno, w którym użytkownik widzi numer i decyduje o rozpoczęciu połączenia):
string numerTelefonu = "+48 123 456 789";
Intent i = new Intent(Intent.ActionDial);
i.SetData(Android.Net.Uri.Parse("tel:" + numerTelefonu));
StartActivity(i);
lub lepiej:
try
{
string numerTelefonu = "+48 123 456 789";
Intent i = new Intent(Intent.ActionDial);
i.SetData(Android.Net.Uri.Parse("tel:" + numerTelefonu));
if (ActivityCompat.CheckSelfPermission(this, Manifest.Permission.CallPhone) != Permission.Granted)
{
throw new System.Exception("Nie uzyskano zgody");
}
else StartActivity(i);
}
catch (Java.Lang.Exception exc)
{
Toast.MakeText(ApplicationContext, exc.Message, ToastLength.Long).Show();
}
---------
string tekst = "Przykładowa treść";
string numerTelefonu = "+48 123 456 789";
Intent i = new Intent(Intent.ActionSendto, Android.Net.Uri.Parse("smsto:" + numerTelefonu));
i.PutExtra("sms_body", tekst);
StartActivity(i);
Bez okna
Wymagane uprawnienie: SEND_SMS
try
{
string numerTelefonu = "+48 123 456 789";
zdobądźUprawnienia(this, Manifest.Permission.SendSms, 0);
SmsManager sms = SmsManager.Default;
PendingIntent pi = PendingIntent.GetActivity(
BaseContext, 0,
new Intent(BaseContext, typeof(MainActivity)),
0);
sms.SendTextMessage(
numerTelefonu, null, "Przykładowy SMS",
null, null);
}
catch (Java.Lang.Exception exc)
{
Toast.MakeText(ApplicationContext, exc.Message, ToastLength.Long).Show();
}