3
votes

Liste retourne vide

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

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


0 commentaires

3 Réponses :


2
votes

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


8 commentaires

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



1
votes

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?


0 commentaires

0
votes

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;


1 commentaires