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

來源:互聯網
上載者:User

公司新需求,要求在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互動的方式進行修改,這種方法也是可以使用的,我已經實驗過了。只不過覺得上面介紹的方法比較簡單,對代碼的修改較小。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.