バックグラウンド
API 17 (Jelly Bean) 以降、Android ユーザーは複数のユーザーが同じデバイスを使用することが可能になりました。当初はタブレットのみでしたが、Lollipop(API 21)ではスマートフォンでも利用できるようになりました。
現在のユーザーが現在のデバイスの他のユーザー間で共有しているアプリを確認しようとしています。これにより、すべてのユーザーに対してアンインストールを実行できることをユーザーに通知する必要があるかどうかを知ることができます (ここに書かれています)。それは、アプリを管理およびアンインストールできるアプリを作成したためです (ここ)。
問題
ルートを使用しなくても、うまく行う方法が見つかりません。
私が試したこと
「 UserManager」と「PackageManager」をそのまま使用することで、それを行う方法を見つけたと思いました。
UserManager um=(UserManager)getSystemService(Context.USER_SERVICE);
final PackageManager packageManager=getPackageManager();
Log.d("AppLog","users count:"+um.getUserCount());
for(UserHandle userHandle : um.getUserProfiles()){
final long serialNumberForUser=um.getSerialNumberForUser(userHandle);
Log.d("AppLog","serial number:"+serialNumberForUser);
final String[] packagesForUid=packageManager.getPackagesForUid((int)serialNumberForUser);
StringBuilder sb=new StringBuilder();
for(String packageName : packagesForUid){
sb.append(packageName+" ");
}
Log.d("AppLog","packages:"+sb.toString());
}
ただし、いくつかの問題があります。 - 関数「getUserProfiles」には API 21 以降が必要です。- 関数「getPackagesForUid」には「int」パラメーターが必要ですが、「 long 」変数があります (「getSerialNumberForUser」から)。それが本当に正しい方法かどうかはわかりません。- "UserManager" クラスで使用した関数のほとんど (またはすべて?) には "MANAGE_USERS" パーミッションが必要ですが、明らかにこれは "signature|system" パーミッションであり、簡単には付与されません。
そのため、機能せず、クラッシュします。
質問
とにかくこの情報を見つける方法はありますか?他のユーザーにもインストールされているアプリは?