Сортировка приложений по использованию в Android (для CustomShareBottomSheetFragment)

Проблема

Я пытаюсь создать страницу выбора намерения поделиться [BottomSheetFragment] для обмена текстом в моем приложении, но я не могу отсортировать приложения в соответствии с наиболее часто используемыми пользователями приложениями, соответствующий список приложений идет в случайном порядке. Я хочу реализовать это без разрешения пользователя.

На фотографии видно, что Google Photos не использует намерение общего доступа по умолчанию. Многие другие приложения, такие как Youtube, также делают то же самое, но я не смог найти код для сортировки приложений на основе использования без разрешения.

Поделиться текстовой страницей в Моем приложении — WhatsApp должен занимать первое место в зависимости от использования.

Поделитесь страницей с фотографиями в приложении Google Фото

Код, который я пробовал, имел следующие проблемы

  1. При использовании приведенного ниже кода была доступна только сортировка по алфавиту.

    PackageManager pm = context.getPackageManager();
    
    Intent mainIntent = new Intent(Intent.ACTION_SEND, null);
    
    mainIntent.setType("text/plain");
    
    List<ResolveInfo> resolveInfos = pm.queryIntentActivities(mainIntent, PackageManager.MATCH_DEFAULT_ONLY); 
    
    Collections.sort(resolveInfos, new ResolveInfo.DisplayNameComparator(pm));

  1. Я смог сделать это, взяв у пользователя разрешение «android.permission.PACKAGE_USAGE_STATS». Но я не могу получить это разрешение в своем производственном приложении только для обмена текстом.

import android.app.usage.UsageStats;
import android.app.usage.UsageStatsManager;
import android.content.Context;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.os.UserHandle;
import android.util.Log;


import java.text.Collator;
import java.util.Calendar;
import java.util.Comparator;
import java.util.List;
import java.util.Map;

public class AppUsageUtil {
	private static final String TAG = "AppUsageUtil";

	/**
	 * Method
	 *
	 * @param apkPackageName

	 * @return Runtime.
	 */
	public static long  getAppRuntime(String apkPackageName) {
		long timeInForeground = 0;
		try {
			Calendar calendar = Calendar.getInstance();
			calendar.add(Calendar.MONTH, -1);
			long start = calendar.getTimeInMillis();
			long end = System.currentTimeMillis();
			Log.d(TAG, "start: "+ start);
			Log.d(TAG, "end: "+ end);

			UsageStatsManager usageStatsManager = (UsageStatsManager) BaseApplication.Companion.getContext().getSystemService(Context.USAGE_STATS_SERVICE);
			Map<String, UsageStats> usageStats = usageStatsManager.queryAndAggregateUsageStats(start, end);
			Log.d(TAG, "usageStats: "+ usageStats);
			timeInForeground = usageStats.get(apkPackageName).getTotalTimeInForeground();

		} catch (Exception e){
			Log.d(TAG, "getAppRuntime: " + e.toString());
		}

		return timeInForeground;
	}

	public static class AppUsageNameComparator implements Comparator<ResolveInfo> {
		public AppUsageNameComparator(List<ResolveInfo> resolveInfos) {
			mCollator.setStrength(Collator.PRIMARY);
		}

		public final int compare(ResolveInfo resolveInfoA, ResolveInfo resolveInfoB) {
			// We want to put the one targeted to another user at the end of the dialog.
			long usage1 = getAppRuntime(resolveInfoA.activityInfo.packageName);
			long usage2 = getAppRuntime(resolveInfoB.activityInfo.packageName);
			return Long.compare(usage1, usage2);
		}

		private final Collator mCollator = Collator.getInstance();
	}
}

Помощь будет оценена. Спасибо

Примечание. Кто-то рассказал, как сортировать приложения по алфавиту, но я хочу отсортировать их по использованию. Соответствующая ссылка: Сортировка приложений Android по алфавиту?


person Ujjwal Agrawal    schedule 03.06.2020    source источник
comment
Я думаю, что это невозможно просто потому, что Google не хочет никому сообщать, какое приложение чаще всего используется пользователем, не спрашивая разрешения, что имеет смысл из-за конфиденциальности пользователя.   -  person Ujjwal Agrawal    schedule 04.09.2020