2024. május 5., vasárnap

Gyorskeresés

Útvonal

Cikkek » Számtech rovat

Android alkalmazásfejlesztés 3. rész: egy hasznos példa

A következőkben néhány hasznos dolgot fogok nektek bemutatni egy egyszerű, mégis komplex példán keresztül.

[ ÚJ TESZT ]

Jogosultságok kezelése

Mielőtt neki látnánk a valós felület és működés eléréshez, kicsit bele kell mélyednünk a jogosultságok kezelésébe. Alapvetően kétféle jogosultságot különböztetünk meg. A Google által biztonságosnak definiált jogosultságok és a nem biztonságosok. Az utóbbi csoportot a felhasználónak is engedélyeznie kell és futásidőben kell kérelmezni. Most két ilyen jogosultsággal fogunk foglalkozni.

Elsősorban az AndroidManifest.xml-ben kell definiálni két új pontot.

<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.CALL_PHONE" />

Ez a két pont a manifest gyökér elembe kell, hogy bekerüljön. Ezzel tudatjuk, hogy használni fogja az alkalmazásunk az alábbi jogosultságokat. Ezzel mindössze annyi történik, hogy a beállításokban a jogosultságok fül alatt megjelenik a két jogosultság és kézzel megadhatjuk őket de kérelmezés nincs.

A kérelmezést a MainActivity-ben intézzük el. Előre definiálunk egy konstanst, ami lényegében egy tetszőleges int. Ez lesz a jogosultságigénylés azonosítója.

final int MY_PERMISSIONS = 100;

Majd az onCreate metódusban kérelmezzük a jogosultságot:

ActivityCompat.requestPermissions(
MainActivity.this,
new String[]{
Manifest.permission.CALL_PHONE,
Manifest.permission.READ_CONTACTS},
MY_PERMISSIONS);

Ez dobja fel a kérelmező dialógust, majd pedig lefut az onRequestPermissionsResult metódus, amit felülírunk a saját igénylő kódunknak megfelelően:

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS: {
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED
&& grantResults[1] == PackageManager.PERMISSION_GRANTED) {
// Ha mind a két jog meg lett adva csak akkor inicializáljuk a ViewPager-t
setupViewPager(viewPager);
}
return;
}
}
}

Természetesen mivel a setupViewPager hívása átkerült ide, így az onCreate-ből ki kell venni.
Látszik, hogy az if ágba csak az van kezelve, hogy meglett-e adva mind a két jog, ha csak az egyik is el lett utasítva, nem történik semmi, de nem is linkelődnek össze a fragmentek a layouttal. Ilyen esetben legalább jelezni lehetne a felhasználó felé a hibát, hisz ha újra indítja az alkalmazást, újra felteszi a kérdést. Például egy toast message tökéletes lenne:

Toast toast = Toast.makeText(getApplicationContext(), "Jogosultságok elutasítva", Toast.LENGTH_SHORT);
toast.show();

Tehát ezt az else ágba bevezetve így néz ki a metódus:

@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS: {
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED
&& grantResults[1] == PackageManager.PERMISSION_GRANTED) {
setupViewPager(viewPager);
} else {
Toast toast = Toast.makeText(getApplicationContext(), "Jogosultságok elutasítva",
Toast.LENGTH_SHORT);
toast.show();
}
return;
}
}
}

Aztán a tényleges jogosultságkezelés pedig így valósul meg:

Mivel nincs több dolgunk a MainActivity-ben, itt látható, hogy hogyan is néz ki az egész egyben:

public class MainActivity extends AppCompatActivity {

private TabLayout tabLayout;
private ViewPager viewPager;
final int MY_PERMISSIONS = 100;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

ActivityCompat.requestPermissions(
MainActivity.this,
new String[]{
Manifest.permission.CALL_PHONE,
Manifest.permission.READ_CONTACTS},
MY_PERMISSIONS);

viewPager = findViewById(R.id.container);
tabLayout = findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
}

@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS: {
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED
&& grantResults[1] == PackageManager.PERMISSION_GRANTED) {
setupViewPager(viewPager);
} else {
Toast toast = Toast.makeText(getApplicationContext(), "Jogosultságok elutasítva",
Toast.LENGTH_SHORT);
toast.show();
}
return;
}
}
}

private void setupViewPager(ViewPager viewPager) {
ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
adapter.addFragment(new DialerFragment(), "Dialer");
adapter.addFragment(new ContactsFragment(), "Contacts");
viewPager.setAdapter(adapter);
}

class ViewPagerAdapter extends FragmentPagerAdapter {
private final List<Fragment> fragmentList = new ArrayList<>();
private final List<String> fragmentTitleList = new ArrayList<>();

public ViewPagerAdapter(FragmentManager manager) {
super(manager);
}

@Override
public Fragment getItem(int position) {
return fragmentList.get(position);
}

@Override
public int getCount() {
return fragmentList.size();
}

@Override
public CharSequence getPageTitle(int position) {
return fragmentTitleList.get(position);
}

public void addFragment(Fragment fragment, String title) {
fragmentList.add(fragment);
fragmentTitleList.add(title);
}

}

}

A cikk még nem ért véget, kérlek, lapozz!

Előzmények

Hirdetés

Copyright © 2000-2024 PROHARDVER Informatikai Kft.