Je souhaite utiliser le journal pour toutes les applications installées sur le téléphone, mais une liste vide est toujours renvoyée. Voici le code que j'utilise.
Voici app.js des informations sur les applications d'appel natives de réaction à partir du code natif java
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.returnappsinformations" xmlns:tools="http://schemas.android.com/tools"> <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" tools:ignore="ProtectedPermissions" /> </manifest>
Voici mon code natif simple pour renvoyer le tableau avec des données
UsageStatsManager manager = (UsageStatsManager) this.reactContext.getSystemService(this.reactContext.USAGE_STATS_SERVICE); List<UsageStats> stats =manager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY,1729196, System.currentTimeMillis()); WritableArray list2 = Arguments.createArray(); for (int i = 0; i < stats.size(); i++) { UsageStats usageStats = stats.get(i); WritableMap appInfo2 = Arguments.createMap(); appInfo2.putString("packageName", usageStats.getPackageName()); appInfo2.putDouble("firsTimeStamp", usageStats.getFirstTimeStamp()); appInfo2.putDouble("getTotalTimeInForeground", usageStats.getTotalTimeInForeground()); list2.pushMap(appInfo2); } promise.resolve(list2);
Qu'est-ce que je fais de mal? C'est ma première application donc je n'ai pas beaucoup de connaissances
Mis à jour comme suggéré par Julien, mais génère toujours un tableau vide.
loadApps = async () => { await ReturnAppsInformations.getApps() .then(response => { console.log(response); // only [] <---- this.setState({ apps }); }) .catch(error => { console.warn(error); }); }
Ok, j'ai trouvé ces gits à ce sujet ...
https : //github.com/mvincent7891/UsageStatsModule
https://github.com/shimatai/react-native-android-datausage
https://github.com/lucasferreira/react-native-android-permissions
Ce soir, je vais les lire ... Mais je crois, qui résout le problème pour moi !! Merci pour votre soutien !!!
3 Réponses :
Avez-vous demandé et défini les autorisations nécessaires pour utiliser UsageStatsManager
?
UsageStatsManager
documentation indique que vous devez déclarer android.permission.PACKAGE_USAGE_STATS dans votre manifeste et qu'il doit être activé dans les paramètres de votre téléphone pour votre application particulière.
MODIFIER:
Autorisation d'ajouter dans votre manifeste:
Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
Cette autorisation spéciale ne peut pas être accordée via l'API d'autorisations normales d'Android. Vous devrez donc rediriger vos utilisateurs vers la page Paramètres où ils pourront l'accorder manuellement. Vous pouvez ouvrir le bon écran Paramètres via l'intention:
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" />
Merci Julien, mal le faire et je te réponds !!
Hé, manifeste Android inséré, mais seulement toujours avec une réponse vide :(
Vous devez également accepter la permission sur votre téléphone. Puisqu'il s'agit d'une autorisation "spéciale", il n'y a aucun moyen de la demander par programme. Vous devrez aller dans Paramètres => Applications et notifications => Avancé => Accès spécial aux applications => Accès à l'utilisation (c'est sur un téléphone Pixel, cela peut être ailleurs sur d'autres applications de paramètres du fabricant)
(et désolé, j'ai confondu l'autorisation avec la constante Paramètres, je l'ai corrigée dans ma réponse d'origine)
Oh mon Dieu, n'y a-t-il donc aucun moyen de faire cela automatiquement?
Je ne crois pas. Vous pouvez jeter un œil à l'application ActionDash qui fait ce que vous voulez avec un bon flux d'intégration: play.google.com/store/apps/details?id=com.actiondash.playsto re
Maintenant, j'utilise une tâche d'arrière-plan pour enregistrer dans la base de données les données des jours ... je crée une même application pour différentes raisons: p Julien Arzul
facebook.github.io/react-native/docs/headless-js- android résoudre ce problème !! Mais seulement pour Android, pendant un certain temps ...
vous devez déclarer android.permission.PACKAGE_USAGE_STATS
dans votre Manifest
if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.PACKAGE_USAGE_STATS) != PackageManager.PERMISSION_GRANTED) { // Permission is not granted }
ainsi que vérifier au moment de l'exécution p >
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" tools:ignore="ProtectedPermissions" />
pour en savoir plus, consultez Comment utiliser UsageStatsManager?
Comme @JulienArzul l'a souligné, vous devez ajouter l'autorisation android.settings.USAGE_ACCESS_SETTINGS
, puis vérifier si vous l'avez ou non en utilisant le code ci-dessous: -
Intent intent = new Intent(MainActivity.this, AppLockService.class); intent.setAction(AppLockService.ACTION_START_FOREGROUND_SERVICE); startService(intent);
Si la condition ci-dessus renvoie false, redirigez l'utilisateur vers l'écran des paramètres de cette autorisation
AppOpsManager appOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE); int mode = appOps.checkOpNoThrow(OPSTR_GET_USAGE_STATS, myUid(), context.getPackageName()); return mode == MODE_ALLOWED;
Merci, je vois ce im ici github.com/lucasferreira/react-native-android-permissions