2

UIなしでアプリを作成したいのですが、アプリのアイコンを押すと懐中電灯のオン/オフが切り替わります。

部分的に機能する透過的なアクティビティを作成しようとしました(懐中電灯がオフの場合は機能しますが、オンのときにアプリのアイコンを使用してオフにすると、オフになりますが、アプリはエラーダイアログでクラッシュします)。

上記は私が望むものを達成するための良い方法ではなく、おそらくサービスを使用する必要があると思いますが、私は開発に不慣れであり、サービスをコーディングする方法を本当に知りません。

そこで、アプリのアイコンショートカットを使用して懐中電灯のオン/オフを切り替えるための最良のアプローチを教えてください。また、基本的な例を示してください。前もって感謝します。

コードは次のとおりです。

public class Flashlight extends Activity {

private boolean isLighOn = false;
private Camera camera;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_flashlight);

    Context context = this;
    PackageManager pm = context.getPackageManager();

    // if device support camera?
    if (!pm.hasSystemFeature(PackageManager.FEATURE_CAMERA)) {
        Log.e("err", "Device has no camera!");
        return;
    }

    camera = Camera.open();
    final Parameters p = camera.getParameters();

    if (isLighOn) {

        Log.i("info", "torch is turn off!");

        p.setFlashMode(Parameters.FLASH_MODE_OFF);
        camera.setParameters(p);
        camera.stopPreview();
        isLighOn = false;

    } else {

        Log.i("info", "torch is turn on!");

        p.setFlashMode(Parameters.FLASH_MODE_TORCH);

        camera.setParameters(p);
        camera.startPreview();
        isLighOn = true;

    }
    finish();

          };

      @Override
      public void onPause() {
      super.onPause();
  bundle.putBoolean("toggleFlashlight", isLighOn);
     }

     public void onResume() {
 super.onResume();
     }

@Override
protected void onStop() {
    super.onStop();

   }
  }  
 }

そしてここにlogcatエラーがあります:

E/QualcommCamera(  116): Qint android::get_camera_info(int, camera_info*): E
I/QualcommCameraHardware(  116): Found a matching camera info for ID 0
I/QualcommCameraHardware(  116): HAL_getCameraInfo: orientation = 90
I/QualcommCameraHardware(  116): HAL_getCameraInfo: modes supported = 5
W/CameraService(  116): CameraService::connect X (pid 6147) rejected (existing c
lient).
W/dalvikvm( 6147): threadid=1: thread exiting with uncaught exception (group=0x4
0c911f8)
E/AndroidRuntime( 6147): FATAL EXCEPTION: main
E/AndroidRuntime( 6147): java.lang.RuntimeException: Unable to start activity Co
mponentInfo{com.myprojects.lightsonoff/com.myprojects.lightsonoff.Flashlight}: j
ava.lang.RuntimeException: Fail to connect to camera service
E/AndroidRuntime( 6147):        at android.app.ActivityThread.performLaunchActiv.....
4

2 に答える 2

1

onCreate()これを実現する最も簡単な方法は、メソッドが必要な処理を実行するアクティビティを作成し(ライトの状態を読み取り、それを切り替える)、を呼び出すことfinish()です。UIを表示しない非常に短期間のアクティビティに問題はありません。

于 2012-12-09T11:07:58.483 に答える
0

このアプローチではうまくいかなかったので、懐中電灯をサービスとして始めたサービスを作りました。次に、透過的なアクティビティから、実行されていない場合にblobalブールフラグ(サービスクラスに含まれている)をチェックしてサービスを開始するifステートメントを作成しました。または、すでに実行されている場合は停止します。現在の唯一の問題は、システムが懐中電灯サービスを非常に簡単に強制終了することでした。そのため、次のようなstartForegroundメソッドを含めました。

Notification fakenote = new Notification( 0, null, System.currentTimeMillis() );
    fakenote.flags |= Notification.FLAG_NO_CLEAR;
    startForeground( 2, fakenote );

また、stopForeground(true)をonDestroyメソッドに入れました。今ではうまくいくようです。システムがサービスを完全に強制終了しないようにする方法はありますか?アプリによってのみ強制終了できますか、これが最善の方法ですか?

于 2012-12-10T14:59:33.013 に答える