我正在使用闭源相机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);
答案 0 :(得分:1)
问题是Android没有告诉相机哪个应用正在使用它。
通过libbinder
和Binder
API执行。作为服务流程(如mediaserver),所有调用者请求都将其调用进程信息存储为Binder事务的一部分。这是所有主要服务强制执行权限的方式,他们必须知道请求来自谁!
在Java层,这很容易通过Binder.getCallingPid()
请求。在本机代码中,您必须链接libbinder
并使用类似:
IPCThreadState::self()->getCallingPid()
这是Java包装器所做的事情。