Android-sovelluksissa, joissa halutaan hyödyntää puhelimen kameran salamaa, on tärkeää ymmärtää, kuinka koodissa yhdistetään kamera, salaman käyttö ja sovelluksen muut interaktiot, kuten värinähälytykset ja äänet. Tämä opas käy läpi kameran salaman käytön sekä ilmoitusten hallinnan perusperiaatteet, ja antaa lisätietoja siitä, miten sovelluksista saadaan interaktiivisia ja käyttäjäystävällisiä.

Kameran salaman hallintaan tarvitaan Androidin Camera2-kirjasto, joka tuli saataville Lollipopin (API 21) myötä. Sen avulla voidaan käyttää kameraa entistä monipuolisemmin, myös salaman osalta. Koodissa käytetään setTorchMode()-metodia, joka lisättiin API 23:een (Android 6.0, Marshmallow). Tätä varten tarkistetaan aina, että sovellus on yhteensopiva tarvittavan Android-version kanssa: if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {}. Jos laitteessa ei ole kameraa, jossa on salama, sovellus poistaa käytöstä napin, joka aktivoi salaman. Tämä varmistaa, että käyttäjä ei voi käyttää tätä ominaisuutta laitteilla, joissa sitä ei ole.

Lisäksi sovelluksessa voidaan hyödyntää äänen ja värinän yhdistelmää, joka on hyödyllinen esimerkiksi hälytysten ja ilmoitusten yhteydessä. Android tarjoaa helpon tavan soittaa laitteen oletusilmoitussävy käyttämällä RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION) -metodia. Tämä metodi mahdollistaa sen, että sovellus käyttää automaattisesti käyttäjän valitsemaa ilmoitussävyä. Myös värinä on yksinkertainen lisäominaisuus, joka toteutetaan vibrate()-metodilla. On kuitenkin tärkeää muistaa, että värinän käyttö vaatii erillisen luvan, joka lisätään sovelluksen Manifestiin.

Ilmoituksia käsiteltäessä on suositeltavaa käyttää Toast-komponenttia, joka näyttää lyhyen viestin käyttäjälle. Toastia voidaan muokata täysin omien tarpeiden mukaan. Android Studio tarjoaa kätevän pikakomentohälytyksen, jonka avulla voi luoda yksinkertaisia ilmoituksia nopeasti. Koodissa voidaan asettaa myös räätälöity ulkoasu, kuten mukautettu layout ja gravitaatio, jonka avulla ilmoituksen sijaintia voidaan säätää näytöllä. Esimerkiksi seuraava koodi luo räätälöidyn Toastin, joka näyttää viestin ja kuvan:

java
public void showToast(View view) {
LayoutInflater inflater = (LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View layout = inflater.inflate(R.layout.toast_custom, null); ((TextView) layout.findViewById(android.R.id.message)).setText("Custom Toast");
Toast toast = new Toast(this);
toast.setGravity(Gravity.CENTER,
0, 0); toast.setDuration(Toast.LENGTH_LONG); toast.setView(layout); toast.show(); }

Tämä koodi muokkaa Toastin ulkoasua ja paikkoja näytöllä käyttäen omia resursseja ja asetuksia. CustomToast-luokan luominen mahdollistaa sen, että ilmoitukset voidaan näyttää halutussa muodossa ja sijainnissa, jolloin käyttäjä saa räätälöityjä viestejä sovelluksesta.

Kun käsitellään ilmoituksia ja vuorovaikutusta, on hyvä muistaa, että AlertDialog-luokka tarjoaa monipuoliset mahdollisuudet luoda keskusteluikkunoita, joissa voidaan esittää käyttäjälle valintoja, kuten hyväksymis- tai peruutusvaihtoehtoja. Tämä on erityisen kätevää tilanteissa, joissa käyttäjän tulee tehdä valinta ennen jatkamista, kuten poiston vahvistaminen tai asetusten muuttaminen.

Esimerkki AlertDialogin käytöstä voisi olla tilanne, jossa sovellus pyytää käyttäjää vahvistamaan, haluaako hän poistaa tietyn kohteen:

java
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("Haluatko poistaa tämän kohteen?") .setCancelable(false) .setPositiveButton("Kyllä", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { // Suorita poisto } }) .setNegativeButton("Ei", null); AlertDialog alert = builder.create(); alert.show();

Tämä koodi luo yksinkertaisen vahvistusdialogin, jossa käyttäjä voi valita joko "Kyllä" tai "Ei". Tämäntyyppiset vuorovaikutukset voivat parantaa sovelluksen käytettävyyttä ja tehdä siitä intuitiivisemman.

Ilmoitukset ja vuorovaikutteiset elementit, kuten toastit ja alert dialogit, eivät ole vain teknisiä ominaisuuksia vaan myös osa sovelluksen käyttäjäkokemusta. On tärkeää miettiä, miten ne vaikuttavat käyttäjän vuorovaikutukseen sovelluksen kanssa ja varmistaa, että ne toimivat luotettavasti eri laitteilla ja eri Android-versioilla.

Tärkeää on myös ymmärtää, että käyttäjän yksityisyys ja lupa-asiat ovat keskeisiä seikkoja, joita ei voi sivuuttaa. Vaikka värinä ja ääni ovat hyödyllisiä, niiden käyttö edellyttää aina käyttäjän suostumusta, erityisesti silloin, kun kyseessä on esimerkiksi äänen toistaminen tai puhelimen värinän käyttö. Tämän vuoksi on suositeltavaa testata sovellusta huolellisesti eri laitteilla ja eri käyttöjärjestelmäversioilla, jotta varmistetaan sen luotettavuus ja yhteensopivuus.

Kuinka vastaanottaa tuloksia Android-toiminnoista ja tallentaa sovelluksen tilaa

Android-sovellusten kehityksessä usein tarvitaan tapoja kommunikoida eri aktiviteettien välillä ja säilyttää käyttäjän syöttämät tiedot, vaikka sovellus suljettaisiin hetkellisesti. Yksi hyödyllinen keino on käyttää startActivityForResult()-metodia, joka mahdollistaa toisen aktiviteetin kutsumisen ja tuloksen palauttamisen takaisin alkuperäiseen aktiviteettiin. Samalla on tärkeää huomioida, kuinka sovelluksen tila voidaan tallentaa ja palauttaa, jos sovellus sulkeutuu kesken käytön.

Kun halutaan saada tuloksia toisesta aktiviteetista, ensimmäinen askel on määrittää tuloksen vastaanottamiseen tarvittavat koodirivit. Aluksi tulee avata pääaktiviteetti, MainActivity.java, ja lisätä sinne vakio, joka määrittää, mitä tietoja haetaan. Esimerkiksi:

java
public static final String REQUEST_RESULT = "REQUEST_RESULT";

Tämän jälkeen on muutettava aktiviteetin käynnistystä siten, että se odottaa tulosta. Käytämme startActivityForResult-metodia, joka pyytää tulosta seuraavalla tavalla:

java
public void onClickSwitchActivity(View view) { EditText editText = (EditText)findViewById(R.id.editTextData); String text = editText.getText().toString();
Intent intent = new Intent(this, SecondActivity.class);
intent.putExtra(Intent.EXTRA_TEXT, text); startActivityForResult(intent,
1); }

Kun toisen aktiviteetin tulos palautetaan, sen vastaanottaminen hoidetaan onActivityResult-metodilla. Tämä metodi tarkistaa, että tulos on saatu onnistuneesti ja näyttää sen käyttäjälle:

java
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK) { Toast.makeText(this, Integer.toString(data.getIntExtra(REQUEST_RESULT, 0)), Toast.LENGTH_LONG).show(); } }

Toisessa aktiviteetissa, SecondActivity.java, palautetaan tulos käyttäen setResult-metodia ennen aktiviteetin sulkemista:

java
public void onClickClose(View view) {
Intent returnIntent = new Intent();
returnIntent.putExtra(MainActivity.REQUEST_RESULT,
42); setResult(RESULT_OK, returnIntent); finish(); }

Tämän jälkeen ensimmäinen aktiviteetti voi vastaanottaa tuloksen ja käsitellä sen haluamallaan tavalla.

Tuloksen vastaanottaminen on varsin yksinkertaista, mutta on hyvä ottaa huomioon muutama tärkeä seikka. Ensinnäkin, on suositeltavaa tarkistaa tuloskoodeja, kuten RESULT_OK ja RESULT_CANCEL, jotta voidaan käsitellä tilanteet, joissa käyttäjä peruuttaa toiminnon, esimerkiksi painamalla takaisin-painiketta. Jos käyttäjä sulkee aktiviteetin ennen tuloksen lähettämistä, saattaa tulos olla peruutettu ja siihen liittyvä intentti null-arvolla, mikä voi aiheuttaa virheitä.

Toinen tärkeä huomioitava asia on se, että startActivityForResult-metodissa on myös "requestCode", joka auttaa tunnistamaan, mistä aktiviteetista tulos on tullut, jos sovelluksessa on useita aktiviteetteja. Tämä koodi on erityisen hyödyllinen monivaiheisissa prosesseissa, joissa voi olla useita eri tuloksia käsiteltävänä. Mikäli requestCode on negatiivinen, startActivityForResult ei odota tulosta, vaan toimii kuten startActivity.

Sovellusten elinkaaren hallinta on toinen tärkeä osa käyttäjäkokemusta, ja siihen liittyy myös sovelluksen tilan tallentaminen. Androidin käyttöjärjestelmä on suunniteltu niin, että sovelluksia voi usein keskeyttää ja sulkea resurssien vapauttamiseksi. Käytännössä tämä tarkoittaa, että käyttäjän mahdollisesti syöttämät tiedot voidaan kadottaa, jos sovellus suljetaan esimerkiksi puhelun tai muun sovelluksen avaamisen vuoksi. Tämän estämiseksi Android tarjoaa mekanismeja, kuten onSaveInstanceState() ja onRestoreInstanceState(), jotka mahdollistavat sovelluksen tilan tallentamisen ja palauttamisen.

Esimerkiksi yksinkertaisessa laskurissa voidaan tallentaa laskurin arvo ennen aktiviteetin sulkemista ja palauttaa se takaisin sovelluksen käynnistyessä uudelleen. Näin käyttäjä voi jatkaa sovelluksen käyttöä samasta kohdasta, mihin hän jäi.

java
static final String KEY_COUNTER = "COUNTER";
private int mCounter = 0;
@Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putInt(KEY_COUNTER, mCounter); } @Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState); mCounter = savedInstanceState.getInt(KEY_COUNTER); }

Tämä koodi tallentaa laskurin arvon ja palauttaa sen aktiviteetin uudelleenluonnin yhteydessä. Tämä auttaa varmistamaan, että käyttäjä ei menetä tietoja laitteensa ollessa keskeytettynä tai käynnistyksen jälkeen.

On myös tärkeää huomata, että vaikka nämä mekanismit tarjoavat keinoja säilyttää sovelluksen tila ja palauttaa se keskeytyksen jälkeen, ne eivät ole täysin virheettömiä. Jos sovellus menee alas jollain muulla tavalla, esimerkiksi laitteistovian vuoksi, tilan palautus ei aina onnistu. Tällöin on syytä varautua käyttäjän tietojen mahdolliseen menetykseen ja varmistaa, että sovellus on suunniteltu myös virhetilanteiden käsittelyyn.