фонарик включается/выключается без активности?

Я хочу сделать приложение без пользовательского интерфейса, которое будет включать/выключать фонарик при нажатии на значок приложения.

Я попытался сделать прозрачную активность, которая частично работает (работает, когда фонарик выключен, но когда он включен и использует значок приложения, чтобы выключить его, он выключается, но приложение вылетает с диалоговым окном ошибки).

Я думаю, что вышеизложенное - не лучший способ добиться того, чего я хочу, и, вероятно, мне нужно использовать службу, но я новичок в разработке и действительно не знаю, как кодировать службу.

Итак, я прошу вас указать мне, как лучше всего включить / выключить фонарик с помощью ярлыка значка приложения, и, возможно, привести базовый пример. Заранее спасибо.

Вот код:

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.....

person dancer_69    schedule 09.12.2012    source источник
comment
Вот как я понимаю у вас вопрос: если фонарик. Нажмите на значок приложения -> Включить фонарик. Если включен фонарик. Нажмите на иконку приложения -> выключите фонарик. Все должно быть сделано без пользовательского интерфейса. Это правильно?   -  person Einar Sundgren    schedule 09.12.2012
comment
Создайте службу, которая будет читать Logcat для Android и расшифровывать, какое приложение запущено. Как только это будет сделано, вы можете сохранить флаг, который будет переключаться при запуске активности. Вы можете найти код для чтения logcat из stackoverflow.com/questions/3290936/.   -  person curious    schedule 09.12.2012
comment
@любопытно, тогда ты можешь убивать мух из пулемета. Я имею в виду, конечно, это сработает, но это немного излишнее решение, не так ли?   -  person mah    schedule 09.12.2012


Ответы (2)


Самый простой способ добиться этого — создать активность, чей метод onCreate() делает то, что вам нужно (считывает состояние источника света и переключает его), а затем вызывает finish(). Нет ничего плохого в очень недолгой активности, которая никогда не представляет пользовательский интерфейс.

person mah    schedule 09.12.2012
comment
Я это уже делал, но как я уже сказал, вылетает при включенном фонарике (правда, выключается) и еще меня смущает, что при запуске показывает на секунду только обои. Я не хочу видеть какие-либо изменения на главном экране, когда нажимается ярлык и переключается фонарик. Конечно, может быть, я делаю что-то не так (я просто установил активность в android.manifest). Поэтому, если я смогу исправить эти проблемы без необходимости в другом подходе, я опубликую свой код, чтобы увидеть, что не так. - person dancer_69; 09.12.2012
comment
Авария поправима. В дополнение к публикации вашего кода, опубликуйте ошибку. Что касается мигания пользовательского интерфейса, я не уверен, можно ли это устранить с помощью действия или нет, но если это невозможно, ваше решение станет намного сложнее для его устранения - вам придется создать виджет вместо действия , что косвенно означает, что пользователю нужно будет вручную установить его на экран запуска. Имейте в виду, что на рынке уже есть много (бесплатных) фонариков, прежде чем тратить на это слишком много времени и усилий ;) - person mah; 09.12.2012
comment
Я не хочу использовать виджет (он у меня уже есть). Я хочу сделать это с помощью ярлыка, потому что я смогу изменить его значок, чтобы он соответствовал теме рабочего стола. А также пытаясь улучшить опыт и знания в области кодирования с его помощью. - person dancer_69; 09.12.2012
comment
Удалите вызов setContentView() из вашего onCreate() -- поскольку вы не хотите отображать пользовательский интерфейс, в этом нет необходимости, и это может остановить мерцание пользовательского интерфейса, которое вы видите. Сбой кажется проблемой разрешения, но я только предполагаю; в вашей пасте logcat недостаточно информации - предоставьте больше, если вам нужна помощь (но прочитайте ее, она также может четко объяснить ошибку). - person mah; 09.12.2012
comment
Ваш onPause() помещает логическое значение в пакет, но это кажется странным. Вы не показываете область или инициализацию пакета, поэтому это потенциально ошибка, но я думаю, что это не связано с текущим сбоем. Возможно (если bundle == null), исправление вашего текущего сбоя может привести к сбою. - person mah; 09.12.2012
comment
Вы можете использовать виджет для вашего варианта использования. Обратитесь к этой ссылке stackoverflow.com/questions/7515309/ - person curious; 09.12.2012
comment
Ошибка связана с RuntimeException: Failed to connect to Camera Service. Но существует еще одна проблема, которую я не понял. Даже когда приложение включает фонарик, через 10-20 секунд он снова выключается, и от logcat я получаю сообщение о том, что Activity Flashlight умер. - person dancer_69; 09.12.2012

У меня не получилось заставить его работать с таким подходом, поэтому я создал сервис, в котором запускал фонарик как сервис. Затем из прозрачной активности я создал оператор if, который запустит службу, если она не запущена, проверив логический логический флаг (который включен в класс обслуживания) или остановит его, если он уже запущен. Единственная проблема заключалась в том, что система очень легко отключала службу фонарика, поэтому я включил метод startForeground следующим образом:

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

Также я поставил stopForeground(true) в метод onDestroy. Теперь кажется, что работает нормально. Есть ли способ предотвратить полное уничтожение службы системой, чтобы ее можно было убить только приложением, или это лучшее, что можно сделать?

person dancer_69    schedule 10.12.2012