2015-08-11 3 views
0

Итак, я пытаюсь сделать факел/фонарик на моем телефоне мерцающим или мерцающим относительно быстро. Я добавил плагин для фонарика Cordova в свое приложение и, похоже, работает нормально, но когда я пытаюсь переключить факел быстрее, чем на 500 мс, ничего не меняется. Кажется, он ограничен 500 мс задержкой или чем-то вроде этого. В настоящее время я тестирую Android-браузер Galaxy S4 4.4.4 Я установил другие приложения для фонарей и попытался быстро его включить и выключить, и он отлично работает, поэтому я знаю, что оборудование способно быстрее мигать.Изменить скорость мигания для плагинов-плагинов Cordova

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

У кого-нибудь есть идеи о том, как я могу отменить любую задержку на месте? Или, если у кого-то есть другие методы для этого, меня тоже будут интересовать.

Благодаря

ЯШ:

$(document).ready(function(){ 
    document.addEventListener("deviceready", function() { 
    setInterval(function() { 
     window.plugins.flashlight.toggle(); 
    }, 200); 
    }); 
}); 

flashlight.js

function Flashlight() { 
    // track flashlight state 
    this._isSwitchedOn = false; 
} 

Flashlight.prototype = { 

    available: function (callback) { 
    cordova.exec(function (avail) { 
     callback(avail ? true : false); 
    }, null, "Flashlight", "available", []); 
    }, 

    switchOn: function (successCallback, errorCallback) { 
    this._isSwitchedOn = true; 
    cordova.exec(successCallback, errorCallback, "Flashlight", "switchOn", []); 
    }, 

    switchOff: function (successCallback, errorCallback) { 
    this._isSwitchedOn = false; 
    cordova.exec(successCallback, errorCallback, "Flashlight", "switchOff", []); 
    }, 

    toggle: function (successCallback, errorCallback) { 
    if (this._isSwitchedOn) { 
     this.switchOff(successCallback, errorCallback); 
    } else { 
     this.switchOn(successCallback, errorCallback); 
    } 
    } 
}; 

Flashlight.install = function() { 
    if (!window.plugins) { 
    window.plugins = {}; 
    } 

    window.plugins.flashlight = new Flashlight(); 
    return window.plugins.flashlight; 
}; 

cordova.addConstructor(Flashlight.install); 

flashlight.java

package nl.xservices.plugins; 

import android.content.pm.FeatureInfo; 
import android.content.pm.PackageManager; 
import android.graphics.SurfaceTexture; 
import android.hardware.Camera; 
import android.os.Build; 
import android.util.Log; 
import org.apache.cordova.CallbackContext; 
import org.apache.cordova.CordovaPlugin; 
import org.json.JSONArray; 
import org.json.JSONException; 

public class Flashlight extends CordovaPlugin { 

    private static final String ACTION_AVAILABLE = "available"; 
    private static final String ACTION_SWITCH_ON = "switchOn"; 
    private static final String ACTION_SWITCH_OFF = "switchOff"; 

    private static Boolean capable; 
    private boolean releasing; 
    private Camera mCamera; 

    @Override 
    public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException { 
    Log.d("Flashlight", "Plugin Called: " + action); 
    try { 
     if (action.equals(ACTION_SWITCH_ON)) { 
     // When switching on immediately after checking for isAvailable, 
     // the release method may still be running, so wait a bit. 
     while (releasing) { 
      Thread.sleep(10); 
     } 
     mCamera = Camera.open(); 
     if (Build.VERSION.SDK_INT >= 11) { // honeycomb 
      // required for (at least) the Nexus 5 
      mCamera.setPreviewTexture(new SurfaceTexture(0)); 
     } 
     toggleTorch(true, callbackContext); 
     return true; 
     } else if (action.equals(ACTION_SWITCH_OFF)) { 
     toggleTorch(false, callbackContext); 
     releaseCamera(); 
     return true; 
     } else if (action.equals(ACTION_AVAILABLE)) { 
     if (capable == null) { 
      mCamera = Camera.open(); 
      capable = isCapable(); 
      releaseCamera(); 
     } 
     callbackContext.success(capable ? 1 : 0); 
     return true; 
     } else { 
     callbackContext.error("flashlight." + action + " is not a supported function."); 
     return false; 
     } 
    } catch (Exception e) { 
     callbackContext.error(e.getMessage()); 
     return false; 
    } 
    } 

    private boolean isCapable() { 
    final PackageManager packageManager = this.cordova.getActivity().getPackageManager(); 
    for (final FeatureInfo feature : packageManager.getSystemAvailableFeatures()) { 
     if (PackageManager.FEATURE_CAMERA_FLASH.equalsIgnoreCase(feature.name))  { 
     return true; 
     } 
    } 
    return false; 
    } 

    private void toggleTorch(boolean switchOn, CallbackContext callbackContext) { 
    final Camera.Parameters mParameters = mCamera.getParameters(); 
    if (isCapable()) { 
     mParameters.setFlashMode(switchOn ? Camera.Parameters.FLASH_MODE_TORCH : Camera.Parameters.FLASH_MODE_OFF); 
     mCamera.setParameters(mParameters); 
     mCamera.startPreview(); 
     callbackContext.success(); 
    } else { 
     callbackContext.error("Device is not capable of using the flashlight. Please test with flashlight.available()"); 
    } 
    } 

    private void releaseCamera() { 
    releasing = true; 
    // we need to release the camera, so other apps can use it 
    new Thread(new Runnable() { 
     public void run() { 
     mCamera.setPreviewCallback(null); 
     mCamera.stopPreview(); 
     mCamera.release(); 
     releasing = false; 
     } 
    }).start(); 
    } 
} 

ответ

0

Что вы предлагаете не будет работать хорошо, как фонарик является одним из e более фрагментированные аспекты Android, и многие телефоны просто не смогут соответствовать вашим требованиям, даже если вы не использовали Кордову и были полностью родными.

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

+0

Я вижу ..... хорошо спасибо, что сообщили мне. – Konig

Смежные вопросы