過去 2 日間、私は自分のアプリ、特に /system/frameworks/seccamera.jar で非公開の Samsung フレームワークを使用する可能性を探っていました。まだ何も機能していないので、それが可能かどうか疑問に思っています。
いくつかの背景
QRコードのスキャンを伴うアプリケーションを開発しているため、カメラの画質に大きく依存しています。そのため、アプリケーションレベルからカメラを可能な限り制御するのに苦労しています。スキャン速度と信頼性を大幅に向上させる機能の 1 つは、カメラがスポット露出測定を行う機能です。ただし、測光モードを指定する公開 API はありません。
ただし、Galaxy Tab 2 に組み込まれているカメラ アプリを使用すると、いくつかの露出測光モードを指定でき、その中からスポット測光モードを指定できます。そこで、さらに調べてみることにしました。
私がすでに試したこと
- /system/frameworks から Eclipse を使用して組み込みカメラ アプリの apk ファイルと odex ファイルを取得しました
- odex ファイルを baksmali で実行したところ、いくつかの .smali ファイルが作成されました。
- 私はそれらを「exposureMetering」で検索し、パラメータ内部クラスを介して露出測定モードの指定をサポートするクラス com.sec.android.seccamera.SecCamera を見つけました
このクラスは 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 クラスには public 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
は私のプロジェクト クラスの 1 つで、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
それで、私はここで何が間違っていますか?(既存のアプリにパッチを適用するのではなく) カスタム アプリでプライベート フレームワークを使用することはできますか?