3

インテントを送信したプロセスのプロセス ID またはパッケージ名を見つけようとしています。スプーフィングを許可したくないので、プロセス ID またはパッケージ名を余分に入れたくありません (他の質問で尋ねられたように)。私が使用したコードは次のとおりです。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_secure_file_share);
    ...   

    Intent intent = getIntent();

    if (intent != null)
    {
        // get the caller
        String callingPackage = getAppNameByPID(getApplicationContext(),
               Binder.getCallingPid());
    ....
    }
 }

getAppNameByPIDPID をパッケージ名に変換する場所。問題は、Binder.getCallingPid()(呼び出し元ではなく) 受信者の PID を常に返すことです。

発信者の PID を取得するにはどうすればよいですか?

4

2 に答える 2

7

私もこれを試してみましたが、バインドされたサービスを使用してのみ結果を得ることができました。

@Override
public IBinder onBind(Intent intent) {
    @SuppressWarnings("static-access")
    int uid = mBinder.getCallingUid();

    final PackageManager pm = getPackageManager();
    String name = pm.getNameForUid(uid);

    Log.d("ITestService", String.format("onBind: calling name: %s"), name);

    //name is your own package, not the caller

    return mBinder;
}

ただし、AIDL のスタブを実装する場合:

private final ITestService.Stub mBinder = new ITestService.Stub() {
    public void test() {
        //Get caller information
        //UID
        int uid = Binder.getCallingUid();

        final PackageManager pm = getPackageManager();
        String name = pm.getNameForUid(uid);        
        //name will be sharedUserId of caller, OR if not set the package name of the caller

        String[] packageNames = pm.getPackagesForUid(uid);
        //packageNames is a array of packages using that UID, could be more than 1 if using sharedUserIds

        Log.d("ITestService", String.format("Calling uid: %d (getNameForUid: %s)", uid, name));
        for (String packageName : packageNames) {
            Log.d("ITestService", String.format("getPackagesForUid: %s", packageName));
        } 

        //PID
        int pid = Binder.getCallingPid();
        Log.d("ITestService", String.format("Calling pid: %d", pid));
        String processName = "";

        ActivityManager am = (ActivityManager) getSystemService( ACTIVITY_SERVICE );
        List<ActivityManager.RunningAppProcessInfo> processes = am.getRunningAppProcesses();
        for (ActivityManager.RunningAppProcessInfo proc : processes) {
            if (proc.pid == pid) {
                processName = proc.processName;
                Log.d("ITestService", String.format("Found ProcessName of pid(%d): %s", pid, processName));

                //processName will be the package name of the caller, YEAH!
            }
        }
    }
}

どのパッケージがそれを呼び出したかを知りたい場合は、PID が最も信頼できるものになります。

于 2012-09-07T13:19:57.657 に答える
1

を見てみましょう

http://developer.android.com/reference/android/app/ActivityManager.RunningAppProcessInfo.html

于 2012-09-07T13:08:17.060 に答える