0

私は、クローズド ソース カメラ HAL を備えたデバイスで Android のカスタム バージョンに取り組んでいるので、ベンダー カメラの代わりに Android がロードするライブラリであるカメラ ラッパーを追加する必要がありました。ベンダーの実装は回避できます。アプリ間で動作を変える必要があることがわかったので、Snapchat では特定のパラメーターを実装したくありません。たとえば、設定しないとハングアウトがクラッシュします。問題は、Android がどのアプリがカメラを使用しているかをカメラに通知しないことです。次のコードを試して pid を確認しましたが、結果は "/system/bin/mediaserver" であり、私が考えていたものとはまったく異なりました。親 ID を要求するとさらに悪化し、1 が返されました。私が求めているのは、Android Java では些細なことですが、C と、ここで Bionic にあるものに制限されています。

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>

後で

const static char * whiteList[] = {"com.android.camera2"};
const static int whiteListLen = 1;
const pid_t pid = getpid();
char plink[64];
char pname[64];
FILE *fptr;
snprintf(plink, sizeof(plink), "/proc/%i/cmdline", pid);
fptr = fopen(plink, "r");
if (fptr != NULL) {
    ALOGD("Determining name of running PID %i", pid);
    fscanf(fptr, "%s", pname);
    ALOGD("Process is %s", pname);
    for(int i = 0; i < whiteListLen; i++) {
        if(strcmp(whiteList[i], pname) == 0) {
            ALOGD("Camera opened by whitelisted app %s, enabling XXX.", pname);
            XXX;
            break;
            }
        }
} else {
    ALOGD("Unable to open /proc/%i/cmdline", pid);
}
fclose(fptr);
4

1 に答える 1

1

問題は、Android がどのアプリがカメラを使用しているかをカメラに通知しないことです。

libbinderおよびBinderAPIを介して行います。サービス プロセス (mediaserver など) として、呼び出し側のすべての要求は、呼び出しプロセスの情報を Binder トランザクションの一部として格納されます。これは、すべての主要なサービスが許可を強制する方法であり、リクエストの送信者を知る必要があります!

Java レイヤーでは、これを .xml で簡単にリクエストできBinder.getCallingPid()ます。ネイティブ コードでは、次のようにリンクしlibbinderて使用する必要があります。

IPCThreadState::self()->getCallingPid()

これは、Java ラッパーが内部で行うことです。

于 2014-02-26T01:02:44.713 に答える