个人技术分享

1.背景

最近在TV开发中遇到一个问题:如何判断设备烧录过HDCP KEY的问题,由于MTK的官方接口返回值并不准确,只能判断2.2是否烧录,不能准确判断1.4是否烧录过,因为HDCP 的KEY有两个,分别是1.4和2.2,为了兼容更多用户的设备,这两个文件都要烧录成功,MTK的接口如下:

if (MtkTvFApiSystemWrapper.getInstance().checkFile("vendor/tvcertificate/hdcp_key.bin")
                || MtkTvFApiSystemWrapper.getInstance().checkFile("vendor/tvcertificate/hdcp2_key.bin")) {
          //  Toast.makeText(getActivity(), "HDCP KEY已烧录,请勿重复操作!", Toast.LENGTH_LONG);
            hasHdcpKey=true;
        }

为了能准确判断是否烧录了这两个文件,只能换其他方法,

后来经测试发现,烧录HDCP KEY文件后,在 'vendor/tvcertificate/tee'路径下会生成两个文件,分别是0和1,所以只要能够获取该路径下的文件列表就可以判断是否烧录过HDCP KEY文件了。

2.获取'./tee'下的文件列表

  public static final String HDCP_TEE="vendor/tvcertificate/tee";

    /**
     * 判断 ./tee 路径下有没有名为0和1的文件
     * @return
     */
    public static boolean isHasHdcp14() {
        File fileTee = new File(HDCP_TEE);
        File[] listFiles = fileTee.listFiles();
        String[] arrayString = fileTee.list();
        boolean hasHdcp14 = false;
        if (arrayString == null || arrayString.length == 0) {
            Log.d(TAG, "isHasHdcp14: list null");
            return false;
        } else {
            List<String> nameList = Arrays.asList(arrayString);
            for (int i = 0; i < nameList.size(); i++) {
                Log.d(TAG, "isHasHdcp14: list " + nameList.get(i).toString());
                if (nameList.contains("0") && nameList.contains("1")) {
                    hasHdcp14 = true;
                    Log.d(TAG, "isHasHdcp14: = true");
                }
            }
        }
        return hasHdcp14;
    }

因为没有权限读取这个文件,所以返回为null

3.给指定文件权限

要修改init.mt5862.rc文件,mt5862是平台名称,

这个文件有执行顺序,我们选择在开机后修改权限,这样用户如果在开机后,立刻去系统设置中检查HDCP KEY是否烧录也没有问题,因为已经拿到权限了

on boot
    # create the coredump file
    ...
	
	chmod 666 /vendor/tvcertificate/tee
	chmod 666 /vendor/tvcertificate/tee/0
	chmod 666 /vendor/tvcertificate/tee/1

    ...

如上,修改了这个文件后,需要重新编译固件,烧录到设备上,

拿到权限后再调方法就可以获取./tee路径下的文件列表了

其他文件权限,可以参考这个流程。