android系統如何在靜音模式下關閉camera拍照聲音(2)

公司新需求,要求在camera應用中添加一個開關,可以進行拍照聲音的關閉和開啟。

上篇文章解決靜音不能有拍照聲音用的是系統靜音的property,在camera playsound()函數中來進行判斷的(詳見一)。如何自己定義個property,使其既能有get的權限,關鍵是得有set權限。

其實android系統有一個service,是用來進行SystemProperty權限的檢查,它就藏在system/core/init/property_service.c中。

具體修改如下:

 

<SPAN style="FONT-SIZE: 18px">/*
 * Checks permissions for setting system properties.
 * Returns 1 if uid allowed, 0 otherwise.
 */ 
static int check_perms(const char *name, unsigned int uid, unsigned int gid) 
{ 
    int i; 
    if (uid == 0) 
        return 1; 
 
 
    if(!strncmp(name, "ro.", 3)) 
        name +=3; 
 
 
    //add duanyf for start  
    if (strncmp(name, "ty.camera.", 10) == 0){ 
    return 1; 
    } 
    //add duanyf for end  
 
 
    for (i = 0; property_perms[i].prefix; i++) { 
        int tmp; 
        if (strncmp(property_perms[i].prefix, name, 
                    strlen(property_perms[i].prefix)) == 0) { 
            if ((uid && property_perms[i].uid == uid) || 
                (gid && property_perms[i].gid == gid)) { 
                return 1; 
            } 
        } 
    } 
 
 
    return 0; 
}</SPAN> 

/*
 * Checks permissions for setting system properties.
 * Returns 1 if uid allowed, 0 otherwise.
 */
static int check_perms(const char *name, unsigned int uid, unsigned int gid)
{
    int i;
    if (uid == 0)
        return 1;


    if(!strncmp(name, "ro.", 3))
        name +=3;


    //add duanyf for start
    if (strncmp(name, "ty.camera.", 10) == 0){
 return 1;
    }
    //add duanyf for end


    for (i = 0; property_perms[i].prefix; i++) {
        int tmp;
        if (strncmp(property_perms[i].prefix, name,
                    strlen(property_perms[i].prefix)) == 0) {
            if ((uid && property_perms[i].uid == uid) ||
                (gid && property_perms[i].gid == gid)) {
                return 1;
            }
        }
    }


    return 0;
}

 

其中:

    //add duanyf for start
    if (strncmp(name, "ty.camera.", 10) == 0){
return 1;
    }
    //add duanyf for end

就是 修改,相當於開個後門,隻要是ty.camera開頭的SystemProperty都return 1.

然後 再用這個property在cameraservice中當做判斷條件。剩下的就是Camera App的添加開關的修改來。

總結 :此方法合理的避開瞭set需要system權限造成其他未知問題的麻煩。平臺允許不允許這樣修改,那就得跟PM進行商量瞭。

當然 ,還是推薦大傢通過JNI,binder傳遞到cameraservice的系統原生的上層和framework交互的方式進行修改,這種方法也是可以使用的,我已經試驗過瞭。隻不過覺得上面介紹的方法比較簡單,對代碼的修改較小。

 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *