最近两天,我一直在探索在自己的应用程序(尤其是/system/frameworks/seccamera.jar)中使用私有Samsung框架的可能性。什么都没有,所以我想知道是否有可能。
一些背景
我正在开发一个涉及扫描QR码的应用程序,因此它非常依赖于相机的图像质量。因此,我正在努力从应用程序级别对摄像机进行尽可能多的控制。相机进行点曝光测光的能力是极大提高扫描速度和可靠性的功能之一。但是,没有用于指定曝光测光模式的公共API。
但是,使用Galaxy Tab 2上的内置“相机”应用程序,您可以指定几种曝光测光模式,其中包括点测光模式。因此,我决定进一步调查。
我已经尝试过的
我从/ system / frameworks使用Eclipse提取了内置Camera应用程序的apk和odex文件
我通过baksmali运行odex文件,并用了少数.smali文件整理
我在它们中搜索“ exposureMetering”,并找到了com.sec.android.seccamera.SecCamera类,该类支持通过其Parameters内部类指定曝光测光模式
我确定该类位于seccamera.jar(seccamera.odex)中,因此我分别对其进行了Deodex处理:
java -jar baksmali-1.3.3.jar --deodex seccamera.odex -o seccamera
然后,我再次将其重新贴合:
java -jar smali-1.3.3.jar seccamera/ -o seccamera.dex
最后,我通过dex2jar运行dex-file以创建一个jar库:
../dex2jar-0.0.9.8/dex2jar.sh seccamera.dex
我将其作为外部jar链接到了Eclipse项目。我发现SecCamera类与公共android.hardware.Camera具有几乎相同的API,因此使我的代码转换变得更加容易。
该项目的构建没有错误,但是在启动时几乎立即崩溃,并出现以下错误:
06-28 16:49:31.648: E/AndroidRuntime(2329): FATAL EXCEPTION: main
06-28 16:49:31.648: E/AndroidRuntime(2329): java.lang.NoClassDefFoundError: com.google.zxing.client.android.camera.PreviewCallback
06-28 16:49:31.648: E/AndroidRuntime(2329): at com.google.zxing.client.android.camera.CameraManager.<init>(CameraManager.java:70)
06-28 16:49:31.648: E/AndroidRuntime(2329): at com.treelev.biennale.MainActivity.onResume(MainActivity.java:212)
06-28 16:49:31.648: E/AndroidRuntime(2329): at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1158)
06-28 16:49:31.648: E/AndroidRuntime(2329): at android.app.Activity.performResume(Activity.java:4539)
06-28 16:49:31.648: E/AndroidRuntime(2329): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2448)
06-28 16:49:31.648: E/AndroidRuntime(2329): at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2486)
06-28 16:49:31.648: E/AndroidRuntime(2329): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2000)
06-28 16:49:31.648: E/AndroidRuntime(2329): at android.app.ActivityThread.access$600(ActivityThread.java:128)
06-28 16:49:31.648: E/AndroidRuntime(2329): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1161)
06-28 16:49:31.648: E/AndroidRuntime(2329): at android.os.Handler.dispatchMessage(Handler.java:99)
06-28 16:49:31.648: E/AndroidRuntime(2329): at android.os.Looper.loop(Looper.java:137)
06-28 16:49:31.648: E/AndroidRuntime(2329): at android.app.ActivityThread.main(ActivityThread.java:4514)
06-28 16:49:31.648: E/AndroidRuntime(2329): at java.lang.reflect.Method.invokeNative(Native Method)
06-28 16:49:31.648: E/AndroidRuntime(2329): at java.lang.reflect.Method.invoke(Method.java:511)
06-28 16:49:31.648: E/AndroidRuntime(2329): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
06-28 16:49:31.648: E/AndroidRuntime(2329): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
06-28 16:49:31.648: E/AndroidRuntime(2329): at dalvik.system.NativeStart.main(Native Method)
com.google.zxing.client.android.camera.PreviewCallback
是我的项目类之一,我从ZXing项目中借来的,因此很明显。我必须对其进行更改,以便它实现SecCamera.PreviewCallback
而不是Camera.PreviewCallback
。也许这是罪魁祸首。在该错误之前,还有其他一些警告:
06-28 16:49:31.625: I/dalvikvm(2329): Failed resolving Lcom/google/zxing/client/android/camera/PreviewCallback; interface 264 'Lcom/sec/android/seccamera/SecCamera$PreviewCallback;'
06-28 16:49:31.625: W/dalvikvm(2329): Link of class 'Lcom/google/zxing/client/android/camera/PreviewCallback;' failed
06-28 16:49:31.625: E/dalvikvm(2329): Could not find class 'com.google.zxing.client.android.camera.PreviewCallback', referenced from method com.google.zxing.client.android.camera.CameraManager.<init>
06-28 16:49:31.625: W/dalvikvm(2329): VFY: unable to resolve new-instance 111 (Lcom/google/zxing/client/android/camera/PreviewCallback;) in Lcom/google/zxing/client/android/camera/CameraManager;
06-28 16:49:31.625: D/dalvikvm(2329): VFY: replacing opcode 0x22 at 0x000c
06-28 16:49:31.632: I/dalvikvm(2329): Could not find method com.sec.android.seccamera.SecCamera.release, referenced from method com.google.zxing.client.android.camera.CameraManager.closeDriver
06-28 16:49:31.632: W/dalvikvm(2329): VFY: unable to resolve virtual method 1436: Lcom/sec/android/seccamera/SecCamera;.release ()V
06-28 16:49:31.632: D/dalvikvm(2329): VFY: replacing opcode 0x6e at 0x0007
06-28 16:49:31.632: I/dalvikvm(2329): Could not find method com.sec.android.seccamera.SecCamera.open, referenced from method com.google.zxing.client.android.camera.CameraManager.openDriver
06-28 16:49:31.632: W/dalvikvm(2329): VFY: unable to resolve static method 1435: Lcom/sec/android/seccamera/SecCamera;.open ()Lcom/sec/android/seccamera/SecCamera;
06-28 16:49:31.632: D/dalvikvm(2329): VFY: replacing opcode 0x71 at 0x0005
06-28 16:49:31.632: I/dalvikvm(2329): Could not find method com.sec.android.seccamera.SecCamera.setPreviewDisplay, referenced from method com.google.zxing.client.android.camera.CameraManager.openDriver
06-28 16:49:31.632: W/dalvikvm(2329): VFY: unable to resolve virtual method 1439: Lcom/sec/android/seccamera/SecCamera;.setPreviewDisplay (Landroid/view/SurfaceHolder;)V
06-28 16:49:31.632: D/dalvikvm(2329): VFY: replacing opcode 0x6e at 0x0016
那么,我在这里做错了什么?是否可以在我的自定义应用程序中使用私有框架(而不是修补现有应用程序)?
最佳答案
使用这样的外部库时,必须通知程序包管理器在运行时将其链接
在这种情况下,请将以下xml添加到AndroidManifest.xml中的元素
<uses-library android:name="seccamera" />
android在启动时读取/system/etc/permissions/seccamera.xml,并将seccamera lib名称映射到xml提及的文件(在这种情况下为/system/framework/seccamera.jar)
然后,当您将其标记为已使用的库时,操作系统将在运行时将该代码链接到其中,并且您可以自由使用这些类
看起来您已经找到了最困难的部分,使eclipse可以针对它进行编译
至于“窃取”代码,只要您不与任何人共享重建的seccamera.jar并仅使用它来引用代码中的功能(不要将其包含在apk中),我就看不到任何真正的问题
但是三星可能会在以后更改API而不发出警告并破坏您的应用
您可能还希望将其标记为不需要的1,否则它将拒绝在没有该lib的设备上安装
关于android - 是否可以在我自己的应用程序中使用私有(private)三星框架?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11245728/