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 不会告诉相机哪个应用程序正在使用它。

它通过libbinderAPI 实现Binder。作为服务进程(如媒体服务器),所有调用方请求都将其调用进程信息存储为 Binder 事务的一部分。这就是所有主要服务强制执行权限的方式,它们必须知道请求来自谁!

在 Java 层,这很容易用Binder.getCallingPid(). 在本机代码中,您必须链接libbinder并使用以下内容:

IPCThreadState::self()->getCallingPid()

这就是 Java 包装器在幕后所做的。

于 2014-02-26T01:02:44.713 回答