Aller au contenu

[Resolu]Restreindre acces paramètres


Substitut

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.

Modifié par Substitut
Lien vers le commentaire
Partager sur d’autres 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

Lien vers le commentaire
Partager sur d’autres 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 ;-)

Lien vers le commentaire
Partager sur d’autres 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...

Lien vers le commentaire
Partager sur d’autres 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();

Modifié par Invité
Lien vers le commentaire
Partager sur d’autres 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 !

Modifié par Invité
Lien vers le commentaire
Partager sur d’autres 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.)

Lien vers le commentaire
Partager sur d’autres 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")

Modifié par Invité
Lien vers le commentaire
Partager sur d’autres 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.

Modifié par Substitut
Lien vers le commentaire
Partager sur d’autres 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 ! ^^

Lien vers le commentaire
Partager sur d’autres sites

hum... je cherche !

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

:S

Modifié par Invité
Lien vers le commentaire
Partager sur d’autres 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...

Lien vers le commentaire
Partager sur d’autres 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 !)

Lien vers le commentaire
Partager sur d’autres sites

Rejoignez la conversation

Vous pouvez poster maintenant et vous enregistrez plus tard. Si vous avez un compte, connectez-vous maintenant pour poster.

Invité
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • Créer...