Jump to content
Substitut

[Resolu]Restreindre acces paramètres

Recommended Posts

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.

Edited by Substitut

Share this post


Link to post
Share on other sites

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

  • Like 1

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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. ;)

Share this post


Link to post
Share on other sites

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 ;-)

Share this post


Link to post
Share on other sites

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...

Share this post


Link to post
Share on other sites

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();

Edited by Sylvain Duché

Share this post


Link to post
Share on other sites

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}

Share this post


Link to post
Share on other sites

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 !

Edited by Sylvain Duché

Share this post


Link to post
Share on other sites

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.)

Share this post


Link to post
Share on other sites

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")

Edited by Sylvain Duché

Share this post


Link to post
Share on other sites

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.

Edited by Substitut

Share this post


Link to post
Share on other sites

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 !! ;-)

Share this post


Link to post
Share on other sites

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 ! ^^

Share this post


Link to post
Share on other sites

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 ! ^^

Share this post


Link to post
Share on other sites

hum... je cherche !

Oui pas évident, moi je tombe tjs sur la meme classe, qqsoit le settings ou je vais...

:S

Edited by Sylvain Duché

Share this post


Link to post
Share on other sites

J'utilise pas ddms mais le logCat de netbeans donc ca va prendre un peu de temps ! ^^

Edit : Oui d'où le problème ! ^^ !

Edited by Substitut

Share this post


Link to post
Share on other sites

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...

Share this post


Link to post
Share on other sites

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 !)

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.






×
×
  • Create New...