0

バックグラウンド

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" パーミッションであり、簡単には付与されません。

そのため、機能せず、クラッシュします。

質問

とにかくこの情報を見つける方法はありますか?他のユーザーにもインストールされているアプリは?

4

1 に答える 1

1

root アクセス権があり、Android がディレクトリ構造を再度変更しない場合は、/data/user/. 各サブディレクトリはユーザーを表し、各第 2 レベルのサブディレクトリはインストール済みアプリを表します (例:/data/user/0/com.example.maypp/data/user/1/com.example.someotherapp.

于 2015-08-21T12:22:31.563 に答える