Substitut Posté(e) 16 avril 2012 Share Posté(e) 16 avril 2012 (modifié) Bonjour, Depuis quelque jour je cherche à restreindre l'accès aux paramètres de la tablettes grâce à mon application. Les tablettes seront gérés par un administrateur ( gère les appli autorisées, etc ) et donc les utilisateurs ne peuvent pas avoir accès aux paramètres car ils pourrait desactiver mon application et faire ce qu'ils veulent. Malheureusement je n'arrive pas à bloquer cet acces. J'ai essayé de gérer cette accès grace à un Broadcast Receiver mais rien ne se passe... <receive android:name="com.commonsware.settings.SettingsReceiver"> <intent-filter> <action android:name="android.settings.SETTINGS" /> </intent-filter> </receive> Si quelqu'un sait comment je pourrait faire ca. Merci. Modifié 18 avril 2012 par Substitut Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Invité Posté(e) 16 avril 2012 Share Posté(e) 16 avril 2012 C'est plus complexe; il faut faire un service qui tourne en tache de fond et qui regarde quel est le service lancé en avant plan. Si ce sont les parametres alors tu fermes l'acces en lancant autre chose ! package mon_package_name; import java.util.List; import orange.mmt.homescreen.utils.KilledServiceReceiver; import orange.mmt.homescreen.utils.PrefsHelper; import orange.mmt.homescreen.utils.Statics; import android.app.ActivityManager; import android.app.AlarmManager; import android.app.PendingIntent; import android.app.ActivityManager.RunningTaskInfo; import android.app.Service; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.util.Log; import android.widget.Toast; public class KeeperService extends Service { protected static final String TAG = "KeeperService"; @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { super.onCreate(); if(Statics.debug) Log.d(TAG, "## onCreate ##"); final Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); if (msg.what == 1) { Toast.makeText(KeeperService.this, "Verrouillage :\nVous ne pouvez pas accéder à ce service.", Toast.LENGTH_SHORT).show(); Intent startMain = new Intent(Intent.ACTION_MAIN); startMain.addCategory(Intent.CATEGORY_HOME); startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(startMain); } } }; new Thread() { public void run() { checkTopActivity(KeeperService.this, handler); } }.start(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { return Service.START_STICKY; } private void checkTopActivity(Context context, Handler handler) { while (true) { try { ComponentName localComponentName = getTopComponent(); if (localComponentName == null) { continue; } String str2 = localComponentName.getPackageName(); if (str2.equalsIgnoreCase("com.sec.android.app.controlpanel") || PrefsHelper.containsKey(KeeperService.this, str2)) { handler.sendEmptyMessage(1); } } catch (Exception e) { } try { Thread.sleep(100); } catch (Exception e) { } } } public ComponentName getTopComponent() { try { ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); List<RunningTaskInfo> localList = activityManager.getRunningTasks(1); if ((localList == null) || (localList.size() == 0)) return null; ComponentName localComponentName = ((ActivityManager.RunningTaskInfo)localList.get(0)).topActivity; return localComponentName; } catch (Exception e) { return null; } } @Override public void onDestroy() { super.onDestroy(); //On déclenche un pending Intent pour relancer le service ! //(meme si on le kill via le "arret" des "services en cours d'execution") AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(this, KilledServiceReceiver.class); PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_ONE_SHOT); am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), pendingIntent); } } Pour pouvoir utiliser les fonctions qui regardent les tasks en cours, ajouter : <uses-permission android:name="android.permission.GET_TASKS" /> dans le manifest. Note: une de mes lignes fait référence a la class PrefsHelper (qui est une classe perso), qui stocke des infos ds les settings de mon app Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Substitut Posté(e) 16 avril 2012 Auteur Share Posté(e) 16 avril 2012 Merci pour ta solution. Je code depuis peu en Android d'où des manques. Mais si j'ai la méthode je devrait réussir, merci à toi. Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Substitut Posté(e) 16 avril 2012 Auteur Share Posté(e) 16 avril 2012 Juste si tu as quelques minutes de plus, je comprend mal ce que fait ton code dans le onDestroy, j'ai commenté cette partie et tout marche nikel, mais je suppose que si tu as mis ca la il doit y avoir une raison. ;) Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Invité Posté(e) 16 avril 2012 Share Posté(e) 16 avril 2012 Cool !! Et bien suivi !! ;-) Oui, en fait le onDestroy est un peu "tricky" ^^ Mon service est un service qui doit tourner tt le temps. Le return Service.START_STICKY; de la méthode onStartCommand permet de relancer le service s'il est killé selon certaines facons (voir doc) J'utilise le onDestroy pour renforcer le truc. En gros je programme une alarme qui va relancer mon service derriere. C'est un peu vieux comme code, mais il me semble que meme si le service est tué (utilisateur ou taskKiller), l'alarme existe encore, donc mon service peut etre relancé... ...à vérifier tout ca ;-) Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Substitut Posté(e) 16 avril 2012 Auteur Share Posté(e) 16 avril 2012 Merci bien ! Tu viens de me libérer d'une semaine de galère. Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Invité Posté(e) 18 avril 2012 Share Posté(e) 18 avril 2012 Un [Resolu] sur le titre du post et ce sera parfait ;-) Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Substitut Posté(e) 23 avril 2012 Auteur Share Posté(e) 23 avril 2012 Bonjour, Grâce a toi j'ai réussi a mettre en place un systeme de mot de passe qui fonctionne parfaitement bien (excepté un petit truc) en fonction du type de paramètres que l'utilisateur veut bloquer. (genre pas le Wireless mais les Applications oui,...) Je me décide donc a vérifier ca sur une tablette en 3.1 et la, c'est le malheur ! A partir de ces versions les paramètres ne sont plus réparties dans plusieurs classes mais dans une seule ( seule les View changent en fonction du paramètre choisie, enfin je suppose que c'est quelque chose de ce genre la) Du coup que faire ? Une idée pour détecter ce changement de View ? Ou une autre solution ? Sinon je me contenterais d'un bloquage totale mais bon... Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Invité Posté(e) 23 avril 2012 Share Posté(e) 23 avril 2012 (modifié) Il faut peut etre regarder au niveau des composants plutot qu'au niveau des activités ! public ComponentName getTopComponent() { try { ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); List<RunningTaskInfo> localList = activityManager.getRunningTasks(1); if ((localList == null) || (localList.size() == 0)) return null; ComponentName localComponentName = ((ActivityManager.RunningTaskInfo)localList.get(0)).topActivity; return localComponentName; } catch (Exception e) { return null; } } Tu regardes le localComponentName et non pas String str2 = localComponentName.getPackageName(); Modifié 23 avril 2012 par Invité Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Substitut Posté(e) 23 avril 2012 Auteur Share Posté(e) 23 avril 2012 Quel que soit le sous-menu de paramètres choisies, le localComponentName contient la même chose : ComponentInfo{com.android.settings/com.android.settings.Settings} Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Invité Posté(e) 23 avril 2012 Share Posté(e) 23 avril 2012 (modifié) En faisant un ((ActivityManager.RunningTaskInfo)localList.get(0)).topActivity.getClassName(); tu récupères les sous classes, donc : com.android.settings.Settings$WirelessSettingsActivity par exemple... ...du coup tu peux solver ton pb !! ;-) Attention, ne fait ca que si ton package est celui des settings ! Modifié 23 avril 2012 par Invité Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Substitut Posté(e) 23 avril 2012 Auteur Share Posté(e) 23 avril 2012 J'avoue que je ne comprend pas très bien ce que tu cherches à me faire faire. Puisque dans tout les cas ce que me retourne le getClassName(), c'est un String dont la valeur est toujours égale à : com.android.settings.Settings (Peu importe dans quel sous-menu des mes paramêtres je suis.) Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Invité Posté(e) 23 avril 2012 Share Posté(e) 23 avril 2012 (modifié) Non ! Testé sur Galaxy Tab 10.1 sous android 3.1 ! Si ds la fct getTopComponent() (cf plus haut) tu ajoutes ce code ComponentName localComponentName = ((ActivityManager.RunningTaskInfo)localList.get(0)).topActivity; String subClasse = localComponentName.getClassName(); if (subClasse.equals("com.android.settings.Settings$WirelessSettingsActivity")) { //Ca marche !! return null;//Mettre un breakPoint ici pour voir que ca atteint ce code ! } Tu verras que ca fait ce que tu veux ! (la pour infos c'est pour le menu "Sans fil et réseaux") Modifié 23 avril 2012 par Invité Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Substitut Posté(e) 23 avril 2012 Auteur Share Posté(e) 23 avril 2012 (modifié) On a du mal se comprendre je pense... Moi je disais que ma solution (qui est la même que la tienne a peu de chose de pret), ne fonctionne plus sur les API à partir de la 11. 10 et inférieur elle fonctionne très bien. En gros pas HoneyComb = glop. HoneyComb = pas glop. Modifié 23 avril 2012 par Substitut Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Invité Posté(e) 23 avril 2012 Share Posté(e) 23 avril 2012 Lol et moi je te dis... que ce code marche sur API = 12... donc >10 si mes cours de primaire ne sont pas trop anciens !! ;-) Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Substitut Posté(e) 23 avril 2012 Auteur Share Posté(e) 23 avril 2012 Je ne comprend pas, j'ai exactement le même code que toi, j'ai même repris ta version de base et cela ne fonctionne pas... import java.util.List; import android.app.ActivityManager; import android.app.AlarmManager; import android.app.PendingIntent; import android.app.ActivityManager.RunningTaskInfo; import android.app.Service; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.util.Log; import android.widget.Toast; public class KeeperService extends Service { protected static final String TAG = "KeeperService"; @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { super.onCreate(); final Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); if (msg.what == 1) { Toast.makeText(KeeperService.this, "Verrouillage :\nVous ne pouvez pas accéder à ce service.", Toast.LENGTH_SHORT).show(); Intent startMain = new Intent(Intent.ACTION_MAIN); startMain.addCategory(Intent.CATEGORY_HOME); startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(startMain); } } }; new Thread() { public void run() { checkTopActivity(KeeperService.this, handler); } }.start(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { return Service.START_STICKY; } private void checkTopActivity(Context context, Handler handler) { while (true) { try { ComponentName localComponentName = getTopComponent(); if (localComponentName == null) { continue; } String str2 = localComponentName.getPackageName(); if (str2.equalsIgnoreCase("com.sec.android.app.controlpanel")) { handler.sendEmptyMessage(1); } } catch (Exception e) { } try { Thread.sleep(100); } catch (Exception e) { } } } public ComponentName getTopComponent() { try { ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); List<RunningTaskInfo> localList = activityManager.getRunningTasks(1); if ((localList == null) || (localList.size() == 0)) return null; ComponentName localComponentName = ((ActivityManager.RunningTaskInfo)localList.get(0)).topActivity; String subClasse = localComponentName.getClassName(); if (subClasse.equals("com.android.settings.Settings$WirelessSettingsActivity")) { Log.e("*******", "ca marche"); return null;//Mettre un breakPoint ici pour voir que ca atteint ce code ! } return localComponentName; } catch (Exception e) { return null; } } @Override public void onDestroy() { super.onDestroy(); //On déclenche un pending Intent pour relancer le service ! //(meme si on le kill via le "arret" des "services en cours d'execution") AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE); //Intent intent = new Intent(this, KilledServiceReceiver.class); //PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_ONE_SHOT); //am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), pendingIntent); } } Une simple erreur de ma part quand tu as donné la version de ta tablette, j'ai confondu samsung galaxy tab 10.1 et version d'android ! Du coup je pensais que tu avais compris mon problème à l'envers ! ^^ Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Invité Posté(e) 23 avril 2012 Share Posté(e) 23 avril 2012 Tu n'atteins jamais cette ligne ? Log.e("*******", "ca marche"); Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Substitut Posté(e) 23 avril 2012 Auteur Share Posté(e) 23 avril 2012 Non absolument jamais... Rien dans le fichier de Log. J'ai même remplacer la condition par précaution et avec "com.android.settings.Settings" Le log s'affiche, mais ca résoud pas mon problème ! ^^ Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Invité Posté(e) 23 avril 2012 Share Posté(e) 23 avril 2012 (modifié) hum... je cherche ! Oui pas évident, moi je tombe tjs sur la meme classe, qqsoit le settings ou je vais... :S Modifié 23 avril 2012 par Invité Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Substitut Posté(e) 23 avril 2012 Auteur Share Posté(e) 23 avril 2012 (modifié) J'utilise pas ddms mais le logCat de netbeans donc ca va prendre un peu de temps ! ^^ Edit : Oui d'où le problème ! ^^ ! Modifié 23 avril 2012 par Substitut Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Invité Posté(e) 23 avril 2012 Share Posté(e) 23 avril 2012 J'ai édité mon post précédent ! :S Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Substitut Posté(e) 23 avril 2012 Auteur Share Posté(e) 23 avril 2012 J'ai vu ! ^^ ! Ca doit surement être possible au final mais j'avoue que la je voit pas comment, et vu comment marche les settings sous HoneyComb, je suppose qu'il s'agit de fragment, donc à moins d'éventuellement savoir quand un fragment est chargé je ne voit pas trop comment faire... Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Invité Posté(e) 23 avril 2012 Share Posté(e) 23 avril 2012 Ah non, je viens de me souvenir... Ca ne marchera pas ! Depuis HoneyComb en effet c'est laissé a la discrétion des constructeurs; en gros meme si tu arrives a gérer les settings avec un device, ce ne sera surement pas géré de la meme facon sur un autre !!!! J'avais lu ca qqpart (ms je n'ai plus la référence !) Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Substitut Posté(e) 23 avril 2012 Auteur Share Posté(e) 23 avril 2012 ='( ! Bon et bien tant pis alors... Merci quand même de ta patience ! =D ! Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Invité Posté(e) 23 avril 2012 Share Posté(e) 23 avril 2012 Avec plaisir !! :-) Et ca m'aura permis de me rappeler ca (et de ne pas le rechercher betement ds qqs mois) Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Recommended Posts
Rejoignez la conversation
Vous pouvez poster maintenant et vous enregistrez plus tard. Si vous avez un compte, connectez-vous maintenant pour poster.