在Android中实现自定义相机HAL

时间:2014-02-25 23:35:30

标签: android camera hal

我正在使用闭源相机HAL的设备上使用Android的自定义版本,因此我必须添加相机包装,这是一个Android加载而不是供应商相机的库,以便可以解决与供应商实施的错误和特点。我发现我需要改变应用之间的行为,因此在Snapchat中我不想实现某个参数,例如,如果我没有设置环聊,则会发生崩溃。问题是Android没有告诉相机哪个应用正在使用它。我尝试了以下代码来查看我的pid是什么,但结果是" / system / bin / mediaserver"不完全是我的想法。要求父母身份更糟糕,它只是返回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);

1 个答案:

答案 0 :(得分:1)

  

问题是Android没有告诉相机哪个应用正在使用它。

通过libbinderBinder API执行。作为服务流程(如mediaserver),所有调用者请求都将其调用进程信息存储为Binder事务的一部分。这是所有主要服务强制执行权限的方式,他们必须知道请求来自谁!

在Java层,这很容易通过Binder.getCallingPid()请求。在本机代码中,您必须链接libbinder并使用类似:

的内容

IPCThreadState::self()->getCallingPid()

这是Java包装器所做的事情。