【问题标题】:Flash Torch on Google Nexus 5Google Nexus 5 上的闪光手电筒
【发布时间】:2014-03-25 09:35:45
【问题描述】:

在阅读了其他有同样问题的用户的所有帖子后,我能够创建一个简单的工作应用程序来打开我的 Nexus 5 上的闪光灯,这是“OnCreate()”方法:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Camera mCamera;
    SurfaceView preview;
    mCamera = Camera.open();
    Parameters params = mCamera.getParameters();
    params.setFlashMode(Parameters.FLASH_MODE_TORCH);
    mCamera.setParameters(params);  
    mCamera.startPreview();
    try {
        mCamera.setPreviewTexture(new SurfaceTexture(0));
        } catch (IOException e) {
        e.printStackTrace();
        }

    if (savedInstanceState == null) {
        getSupportFragmentManager().beginTransaction()
                .add(R.id.container, new PlaceholderFragment()).commit();
    }
}

在清单中我添加了这些权限:

<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.FLASHLIGHT" />
<uses-feature android:name="android.hardware.camera" android:required="false" />
<uses-feature android:name="android.hardware.camera.autofocus" android:required="false" />
<uses-feature android:name="android.hardware.camera.flash" android:required="false" />

我需要将它放在一个更复杂的应用程序中,该应用程序也使用相机。我怎样才能将它添加为方法/类或其他东西,以便它可以在没有冲突的情况下工作?

谢谢

【问题讨论】:

    标签: android camera flashlight nexus-5


    【解决方案1】:

    我刚刚修复了 Nexus 5 的手电筒代码,想分享一下:https://github.com/EddyVerbruggen/Flashlight-PhoneGap-Plugin/issues/7

    在 Cordova 上下文中,最简单的解决方法是在 Camera 类上设置 setPreviewTexture(new SurfaceTexture(0))。

    【讨论】:

      【解决方案2】:

      完成编辑:

      根据您的 cmets,我了解到您希望在使用相机的同时使用手电筒闪光模式。这是可能的,下面是一些纯粹的概念验证代码。请注意,它实现了非常少的异常处理,并且需要进行一些调整才能按您的需要工作,但它会展示让您入门的基础知识。

      main.xml

      <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="fill_parent"
          android:layout_height="fill_parent"
          android:gravity="center"
          android:orientation="vertical" >
      
          <android.view.SurfaceView android:id="@+id/surfaceView"
              android:layout_width="match_parent"
              android:layout_height="0dp"
              android:layout_weight="1" />
      
          <LinearLayout
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:orientation="horizontal" >
      
              <Button
                  android:layout_width="0dp"
                  android:layout_height="wrap_content"
                  android:layout_weight="1"
                  android:onClick="initialize"
                  android:text="Init" />
      
              <Button
                  android:layout_width="0dp"
                  android:layout_height="wrap_content"
                  android:layout_weight="1"
                  android:onClick="takePicture"
                  android:text="Picture" />
      
              <Button
                  android:layout_width="0dp"
                  android:layout_height="wrap_content"
                  android:layout_weight="1"
                  android:onClick="release"
                  android:text="Done" />
      
              <ToggleButton android:id="@+id/tgbToggle"
                  android:layout_width="0dp"
                  android:layout_height="wrap_content"
                  android:layout_weight="1" />
      
          </LinearLayout>
      
      </LinearLayout>
      

      MainActivity.java

      public class MainActivity extends Activity
      {
          Camera camera;
          Parameters params;
          SurfaceView surfaceView;
          SurfaceHolder surfaceHolder;
          PictureCallback callBackJpeg;
      
          Button start, stop, capture;
          ToggleButton toggle;
      
          @Override
          public void onCreate(Bundle savedInstanceState)
          {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.main);
      
              toggle = (ToggleButton) findViewById(R.id.tgbToggle);
              toggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                      @Override
                      public void onCheckedChanged(CompoundButton button, boolean checked)
                      {
                          toggleTorch(checked);
                      }           
                  }
              );
      
              surfaceView = (SurfaceView)findViewById(R.id.surfaceView);
              surfaceHolder = surfaceView.getHolder();
              surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
      
              callBackJpeg = new PictureCallback() {
                  public void onPictureTaken(byte[] data, Camera camera)
                  {
                      FileOutputStream fos = null;
                      String filename = String.format(Environment.getExternalStorageDirectory().toString() +
                                                      "/%d.jpg", System.currentTimeMillis());
                      try
                      {
                          fos = new FileOutputStream(filename);
                          fos.write(data);
                          fos.close();
      
                          Toast.makeText(MainActivity.this, "Picture saved - " + filename, 0).show();
                      }
                      catch (FileNotFoundException e)
                      {
                          e.printStackTrace();
                      }
                      catch (IOException e)
                      {
                          e.printStackTrace();
                      }
                  }
              };
          }
      
          public void initialize(View v)
          {
              camera = Camera.open();
              params = camera.getParameters();
              try
              {
                  camera.setPreviewDisplay(surfaceHolder);
              }
              catch (IOException e)
              {
                  Toast.makeText(this, "Unable to set preview display.", 0).show();
                  return;
              }       
              camera.startPreview();
          }
      
          public void takePicture(View v)
          {
              camera.takePicture(null, null, callBackJpeg);
          }
      
          public void release(View v)
          {
              camera.stopPreview();
              camera.release();
          }
      
          private void toggleTorch(boolean turnOn)
          {
              params.setFlashMode(turnOn ? Parameters.FLASH_MODE_TORCH : Parameters.FLASH_MODE_OFF);
              camera.setParameters(params);
              camera.startPreview();
          }
      }
      

      当应用启动时,您需要点击Init 来启动相机预览。之后,您可以使用切换按钮打开和关闭 Torch,然后单击Picture 拍摄一张照片,该照片将保存到您的外部存储目录的根目录中。您应该在退出或最小化应用程序之前点击Done

      编辑:最小

      在清单中添加以下权限:

      <uses-permission android:name="android.permission.CAMERA" />
      <uses-permission android:name="android.permission.FLASHLIGHT" />
      

      将以下内容添加到您的活动中:

      Camera camera;
      Parameters params;
      
      @Override
      public void onResume()
      {
          super.onResume();
          camera = Camera.open();
          params = camera.getParameters();
          params.setFlashMode(Parameters.FLASH_MODE_TORCH);
          camera.setParameters(params);
          camera.startPreview();
      }
      
      @Override
      public void onPause()
      {
          super.onPause();
          camera.release();
      }
      

      【讨论】:

      • @Mike M.,谢谢你的回答!!我将尝试在我的应用程序中实现您的代码...但在此之前我有一个问题:在我的应用程序中,我需要同时使用闪光灯和相机...这是可能的用你的代码做到这一点?谢谢
      • 好的,试试新代码。让我知道你是否有任何问题。
      • 我会尝试在我的应用程序中包含您的代码,我会通知您!非常感谢
      • 我仍然无法将您代码的基本部分集成到我的应用程序中...请您告诉我真正需要什么才能使代码正常工作?如果我将您的应用程序作为第一个活动,而我的应用程序作为一个独特应用程序的第二个活动,该怎么办?你认为闪光灯还会开吗?最后一个问题……可以避免相机开机吗?非常感谢
      • 我没有关注。你的最终目标是什么?我以为您希望能够同时切换手电筒和使用相机。如果没有,并且您只想单独访问火炬,则可以使用我最初发布的单独的静态方法类。它在我的答案的编辑历史记录中。
      猜你喜欢
      • 1970-01-01
      • 2011-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多