Splash Screen permettant de gérer les permissions de l’application :
Au 1er lancement, demande de chaque permission, si l’utilisateur refuse au moins une permission, alors affichage de l’écran de paramétrage de l’application, sinon, lancement de l’application sans plus jamais demander de permission. A chaque changement de version (indiquée dans app.gradle, affichage de l’EULA ( End User License Agreement) expliquant les conditions d’utilisation de l’application et les modifications apportées par la nouvelle version.
I) EULA ( End User License Agreement) :
a) Création d’une classe java : « Eula.java » :
public class Eula { private String EULA_PREFIX = "eula_"; private Activity mActivity; public Eula(Activity context) { mActivity = context; } public static String getAppNameFromPkgName(Context context, String Packagename) { try { PackageManager packageManager = context.getPackageManager(); ApplicationInfo info = packageManager.getApplicationInfo(Packagename, PackageManager.GET_META_DATA); String appName = (String) packageManager.getApplicationLabel(info); return appName; } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); return ""; } } private PackageInfo getPackageInfo() { PackageInfo pi = null; try { pi = mActivity.getPackageManager().getPackageInfo(mActivity.getPackageName(), PackageManager.GET_ACTIVITIES); } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } return pi; } public void show() { PackageInfo versionInfo = getPackageInfo(); // the eulaKey changes every time you increment the version number in the AndroidManifest.xml final String eulaKey = EULA_PREFIX + versionInfo.versionCode; final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mActivity); boolean hasBeenShown = prefs.getBoolean(eulaKey, false); if (hasBeenShown == false) { // Show the Eula String title = getAppNameFromPkgName(mActivity, mActivity.getPackageName()) + " " + versionInfo.versionName; //Includes the updates as well so users know what changed. String message = mActivity.getString(R.string.updates) + "\n\n" + mActivity.getString(R.string.eula); AlertDialog.Builder builder = new AlertDialog.Builder(mActivity) .setTitle(title) .setMessage(message) .setPositiveButton(android.R.string.ok, new Dialog.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { // Mark this version as read. SharedPreferences.Editor editor = prefs.edit(); editor.putBoolean(eulaKey, true); editor.commit(); dialogInterface.dismiss(); } }) .setNegativeButton(android.R.string.cancel, new Dialog.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // Close the activity as they have declined the EULA mActivity.finish(); } }); builder.create().show(); } } }
Puis dans « res/values/strings.xml » insérez les balises avec le texte souhaité :
"eula">Eula: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus sagittis, est in pulvinar varius, nulla metus suscipit enim, eu volutpat sem magna sed lacus. Donec tempor libero eget dui euismod eget luctus libero tempor. Quisque felis mauris, malesuada accumsan vulputate quis, sodales et nibh. Mauris tellus neque, interdum quis blandit sagittis, tincidunt at urna. Cras luctus feugiat metus, in sollicitudin felis laoreet sed. Mauris posuere mattis felis. Morbi enim odio, accumsan ac tincidunt pharetra, mattis sit amet turpis. Vivamus lobortis aliquet ante nec aliquet. Suspendisse potenti. Praesent rutrum condimentum ante et congue. In faucibus posuere arcu, ut congue sem dictum ac. Cras ante libero, pellentesque et fermentum ut, congue nec mi. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed euismod malesuada sapien ut eleifend.
"updates">Upates in this version: Donec sollicitudin sodales turpis eget congue. Nulla facilisi. Proin facilisis eros vel mauris mollis tempus.
Enfin, insérez la ligne « new Eula(this).show(); » en début de l’activity de votre application, après le super.onCreate.
II) Splash Screen (écran d’attente / d’accueil) avec gestion des permissions (pour Android > 6.0) :
a) Définir un style et un drawable xml pour le dessin de l’écran qui doit s’afficher lors de la demande de permission au démarrage de l’application :
res/values/styles.xml
<style name="SplashTheme"> <item name="android:windowBackground">@drawable/splash
res/drawable/splash.xml
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <gradient android:angle="90" android:endColor="#ff009f" android:startColor="#1a2b5d" android:type="linear" />
Créez la classe Splash.java :
import android.app.Activity; import android.content.ActivityNotFoundException; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.provider.Settings; import android.support.v4.app.ActivityCompat; import android.widget.Toast; import java.util.HashMap; import java.util.Map; import static android.Manifest.permission.READ_CONTACTS; import static android.Manifest.permission.READ_SMS; public class Splash extends Activity { private static final int PERMISSION_ALL = 0; private Handler h; private Runnable r; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); h = new Handler(); r = new Runnable() { @Override public void run() { startActivity(new Intent(Splash.this, MainActivity.class)); finish();} }; String[] PERMISSIONS = { READ_CONTACTS, READ_SMS }; if (!UtilPermissions.hasPermissions(this, PERMISSIONS)) { ActivityCompat.requestPermissions(this, PERMISSIONS, PERMISSION_ALL); } else h.postDelayed(r, 1500); } @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { int index = 0; Map<String, Integer> PermissionsMap = new HashMap<String, Integer>(); for (String permission : permissions) { PermissionsMap.put(permission, grantResults[index]); index++; } if ((PermissionsMap.get(READ_CONTACTS) != 0) || PermissionsMap.get(READ_SMS) != 0) { Toast.makeText(this, getResources().getString(R.string.lib_Perm_Auth)+" "+ getResources().getString(R.string.app_name), Toast.LENGTH_LONG).show(); String packageName = "com.andrologiciels.androtransms"; try { //Open the specific App Info page: Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); Uri uri = Uri.fromParts("package", getPackageName(), null); intent.setData(uri); startActivity(intent); } catch ( ActivityNotFoundException e ) { //Open the generic Apps page: Intent intent = new Intent(android.provider.Settings.ACTION_MANAGE_APPLICATIONS_SETTINGS); startActivity(intent); } finish(); } else { h.postDelayed(r, 1500); } } }
Dans le fichier AndroidManifest.xml, retirer l’intent-filter laundher de la classe MainActivity et insérez :
<activity android:name=".Splash" android:configChanges="orientation|keyboardHidden|screenSize" android:theme="@style/SplashTheme"> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
Ecran d’aide :
Créez une classe « Aide » :
import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.view.View; public class Aide extends FragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_help); } public void dismiss(View v) { finish(); } }
Puis un layout activity_help.xml pour l’écran d’aide :
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:background="@color/opaque" tools:context=".Aide" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:textColor="@android:color/white" android:text="@string/aide" /> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentRight="true" android:onClick="dismiss" android:text="OK" /> </RelativeLayout>
Ajoutez dans colors.xml la couleur opaque :
<color name="opaque" >#cc000000</color>
Puis dans le manifest la déclaration de l’aide :
<activity android:name=".Aide" android:theme="@android:style/Theme.Translucent.NoTitleBar" > </activity>
Enfin, dans l’activité principale appelez l’aide :
bhelp.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, Aide.class); startActivity(intent); } });
Référence : https://www.appsrox.com/android/tutorials/showcase/3/
Références :
http://www.donnfelker.com/android-a-simple-eula-for-your-android-apps/
https://jayeshcp.wordpress.com/2013/07/23/showing-eula-in-android-app/
https://www.bignerdranch.com/blog/splash-screens-the-right-way/