首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Torch应用程序故障

Torch应用程序故障
EN

Stack Overflow用户
提问于 2016-03-20 23:19:18
回答 1查看 110关注 0票数 1

更新:我已经编辑了我的问题,以包括工作代码。我已经解决了我的问题。请看我的最新/上一篇文章。

UPDATE2:代码已于2018-06-08更新。下面是repo:

https://github.com/amboxer21/FlashLightApp

注意:我使用ant从Linux命令行编译。

我有一个火炬应用程序,我试图开始工作,但我没有运气。谁能指出我遗漏了什么并解释一下?我真的很感激!

我可以毫无问题地进行编译。我可以毫无问题地进行推送。我可以毫无问题地切换开和关按钮。我可以从我已经准备好的敬酒中看到这一点。基本上,所有函数似乎都被正确调用,但后置摄像头上的LED灯就是不亮。我在5.1.1上使用Nexus 6,并在Linux上进行开发。此外,我认为在这里值得一提,但我能够在我的Linux box和torch woks上编译一个第三方torch应用程序。

主要活动:

代码语言:javascript
复制
package com.flash.light;

import android.util.Log;

import android.os.Bundle;
import android.os.IBinder;
import android.os.Message;
import android.os.Handler;
import android.os.Messenger;

import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SurfaceView;
import android.view.MenuInflater;
import android.view.SurfaceHolder;
import android.view.View.OnClickListener;

import android.widget.Toast;
import android.widget.Button;
import android.widget.ToggleButton;

import android.hardware.Camera;
import android.hardware.Camera.Parameters;

import android.app.Activity;
import android.app.ActivityManager;
import android.app.ActivityManager.RunningServiceInfo;

import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;

import android.content.Intent;
import android.content.Context;
import android.content.ComponentName;
import android.content.ServiceConnection;

import android.support.v7.app.ActionBar;
import android.support.v7.widget.Toolbar;
import android.support.v7.view.ActionMode;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatDelegate;
import android.support.v7.app.AppCompatCallback;

public class FlashLight extends Activity implements SurfaceHolder.Callback, AppCompatCallback {

  private static final String TAG = "FlashLight FlashLight";

  private Camera mCam;
  private Parameters params;
  private ToggleButton flashLight;
  private SurfaceView surfaceView;
  private Messenger mService = null;
  private SurfaceHolder surfaceHolder;

  private boolean mBound;
  private boolean hasCameraFlash;
  private boolean isBound   = false;
  private boolean isFlashOn = false;
  private static long backPressedTime = 0;

  private static Message mtn;
  private static Message msg;
  private static AppCompatDelegate delegate;
  private static ComponentName componentName;
  private static PackageManager packageManager;

  public void isServiceBound() {
    isBound = getApplicationContext().bindService(new Intent(getApplicationContext(),
      FlashLightService.class), mConnection, Context.BIND_AUTO_CREATE );
    if(isBound) {
      getApplicationContext().unbindService(mConnection);
    }
  }

  public void toast(String text) {
    Toast.makeText(getApplicationContext(), text, Toast.LENGTH_LONG).show();
  }

  private ServiceConnection mConnection = new ServiceConnection() {

    @Override
    public void onServiceDisconnected(ComponentName name) {
      mService = null;
      mBound   = false;
    }

    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
      mService = new Messenger(service);
      mBound   = true;
    }
  };

  @Override
  public void onBackPressed() {
    long mTime = System.currentTimeMillis();
    if(mTime - backPressedTime > 2000) {
      backPressedTime = mTime;
      Toast.makeText(this, "Press back again to close app.", Toast.LENGTH_SHORT).show();
    }
    else {
      finish();
      super.onBackPressed();
    }
  }

  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu items for use in the action bar
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu, menu);
    return super.onCreateOptionsMenu(menu);
  }

  private AppCompatDelegate getDelegate() {
    if (delegate == null) {
      delegate = AppCompatDelegate.create(this, this);
    }

  return delegate;
  }

  public boolean supportRequestWindowFeature(int featureId) {
    return getDelegate().requestWindowFeature(featureId);
  }

  public void invalidateOptionsMenu() {
    getDelegate().invalidateOptionsMenu();
  }

  @Override
  public void onSupportActionModeStarted(ActionMode mode) { }

  @Override
  public void onSupportActionModeFinished(ActionMode mode) { }

  public ActionMode startSupportActionMode(ActionMode.Callback callback) {
    return getDelegate().startSupportActionMode(callback);
  }

  @Nullable
  @Override
  public ActionMode onWindowStartingSupportActionMode(ActionMode.Callback callback) {
    return null;
  }

  @Override
  public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
      case android.R.id.home:
        finish();
        return true;
      case R.id.configureMenu:
        Intent configureIntent = new Intent(getApplicationContext(), Configure.class);
        startActivityForResult(configureIntent, 0);
      default:
        return super.onOptionsItemSelected(item);
    }
  }

  @Override
  public void onDestroy() {
    super.onDestroy();
    try {
      isServiceBound();
      if(mCam != null) {
        mCam.stopPreview();
        mCam.release();
      }
    }
    catch(Exception e) {
      e.printStackTrace();
    }
  }

  @Override
  protected void onSaveInstanceState(Bundle savedInstanceState) {
    savedInstanceState.putBoolean("isFlashOn", isFlashOn);
    super.onSaveInstanceState(savedInstanceState);
  }

  @Override
  public void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    isFlashOn = savedInstanceState.getBoolean("isFlashOn");
  }

  private boolean isMyServiceRunning(Class<?> serviceClass) {
    ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
    for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
      if (serviceClass.getName().equals(service.service.getClassName())) {
        return true;
      }
    }
    return false;
  } 

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

    if(!isMyServiceRunning(FlashLightService.class)) {
      Intent serviceIntent = new Intent(getApplicationContext(), FlashLightService.class);
      startService(serviceIntent);
      getApplicationContext().bindService(new Intent(getApplicationContext(), FlashLightService.class), mConnection,
        Context.BIND_AUTO_CREATE);
    }

    delegate = AppCompatDelegate.create(this, this);
    delegate.onCreate(savedInstanceState);
    delegate.setContentView(R.layout.main);

    Toolbar toolbar = (Toolbar) findViewById(R.id.action_toolbar);

    delegate.setSupportActionBar(toolbar);
    delegate.getSupportActionBar().setDisplayShowTitleEnabled(true);

    if(savedInstanceState != null) {
      isFlashOn = savedInstanceState.getBoolean("isFlashOn");
    }

    surfaceView = (SurfaceView)findViewById(R.id.preview);
    surfaceHolder = surfaceView.getHolder();
    surfaceHolder.addCallback(FlashLight.this);
    surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

    hasCameraFlash = getApplicationContext().getPackageManager()
      .hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);

    if(!(hasCameraFlash)) {
      toast("Camera does not have flash feature.");
      return;
    }
    else {
      getCamera();
    }

    flashLight = (ToggleButton)findViewById(R.id.flashLight);
    flashLight.setOnClickListener(new OnClickListener() {

      @Override
      public void onClick(View view) {
        try {
          if(!(isFlashOn)) {
            params = mCam.getParameters();
            params.setFlashMode(Parameters.FLASH_MODE_TORCH);
            mCam.setParameters(params);
            mCam.startPreview();
            isFlashOn = true;
          }
          else {
            params = mCam.getParameters();
            params.setFlashMode(Parameters.FLASH_MODE_OFF);
            mCam.setParameters(params);
            mCam.stopPreview();
            isFlashOn = false;
          }
        }
        catch(Exception e) {
          e.printStackTrace();
        }
      }
    });
  }

  public void getCamera() throws NullPointerException {
    try {
      if(mCam == null) {
        mCam = Camera.open();
      }
    }
    catch(NullPointerException e) {
      e.printStackTrace();
    }
  }

  public void surfaceCreated(SurfaceHolder holder) {
    try {
      mCam.setPreviewDisplay(holder);
    }
    catch(Exception e) {
      e.printStackTrace();
    }
  }

  public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { }

  public void surfaceDestroyed(SurfaceHolder holder) { } 

}

main.xml:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:background="#E8E8E8"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">

  <android.support.v7.widget.Toolbar
    android:background="#3F51B5"
    android:id="@+id/action_toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:label="@string/app_name">
  </android.support.v7.widget.Toolbar>

  <SurfaceView
    android:id="@+id/preview"
    android:layout_width="1dp"
    android:layout_height="1dp"/>

  <ToggleButton
    android:textOn=""
    android:textOff=""
    android:id="@+id/flashLight"
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:layout_marginBottom="100dp"
    android:background="@drawable/check"
    android:layout_alignParentBottom="true"
    android:layout_centerHorizontal="true"/>

</RelativeLayout>

清单:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.flash.light"
  android:versionCode="1"
  android:versionName="1.0">

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

  <!-- FEATURES -->
  <uses-feature android:name="android.hardware.camera"/>
  <uses-feature android:name="android.hardware.touchscreen"/>
  <uses-feature android:name="android.hardware.camera.flash"/>
  <uses-feature android:name="android.hardware.camera.autofocus"/>

  <!-- TARGET SDK VERSION -->
  <uses-sdk android:minSdkVersion="21"/>
  <application android:label="@string/app_name"
    android:icon="@drawable/ic_launcher">
    <activity android:name="FlashLight"
      android:screenOrientation="portrait"
      android:theme="@style/Theme.AppCompat.NoActionBar"
      android:configChanges="keyboardHidden|orientation|screenSize"
      android:label="@string/app_name">
      <intent-filter>
        <action android:name="android.intent.action.MAIN"/>
        <category android:name="android.intent.category.LAUNCHER"/>
      </intent-filter>
    </activity>
    <service android:name=".FlashLightService" android:enabled="true"/>
  </application>
</manifest>
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36115579

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档