nintyuui 发表于 2015-06-17 09:38

通用型手电筒 Android 代码 转发

妈蛋,前几天广州番禺这边一个小区断电,黑麻麻的,一只猫闯进寝室,把我吓哭,然后就果断写了个手电筒,下次断电,再来,我要吓死它。
我之前看到很多人都是直接调用闪光灯,其实大部分机型都不支持,我这个是用相机功能来实现的,大部分机型都支持。
我发布到 google play 了
https://play.google.com/store/apps/details?id=com.liujinghuiuncleapp.app.tool.flashlight
MainActivity.classpublic class MainActivity extends FragmentActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);

      if (isFlashSupported()) {
            if (savedInstanceState == null) {
                getSupportFragmentManager().beginTransaction().add(R.id.container, new FlashlightFragment()).commit();
            }
      } else {
            showNoFlashAlert();
      }
    }

    private void showNoFlashAlert() {
      new AlertDialog.Builder(this)
                .setMessage(R.string.device_not_support_msg)
                .setIcon(android.R.drawable.ic_dialog_alert).setTitle(R.string.device_not_support_title)
                .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {

                  @Override
                  public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                        finish();
                  }
                }).create().show();
    }

    private boolean isFlashSupported() {
      PackageManager pm = getPackageManager();
      return pm.hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);
    }

    public static class FlashlightFragment extends Fragment implements SurfaceHolder.Callback {

      public FlashlightFragment() { }

      ImageButton btnSwitch;
      ImageView bg;
      private boolean isLighOn = false;

      private Camera camera;
      Camera.Parameters params;

      @Override
      public void onStart() {
            super.onStart();
            SurfaceView preview = (SurfaceView) getView().findViewById(R.id.PREVIEW);
            SurfaceHolder mHolder = preview.getHolder();
            mHolder.addCallback(this);
      }

      @Override
      public void onPause() {
            super.onPause();
            turnOffFlash();
      }

      @Override
      public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.fragment_main_activity, container, false);

            // flash switch button
            btnSwitch = (ImageButton) view.findViewById(R.id.flashlight_button);

            bg = (ImageView) view.findViewById(R.id.flashlight_bg);

            // displaying button image
            toggleBgImage();

            // Switch button click event to toggle flash on/off
            btnSwitch.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                  if (isLighOn) {
                        turnOffFlash();
                  } else {
                        turnOnFlash();
                  }
                }
            });

            return view;
      }

      // Turning On flash
      private void turnOnFlash() {

            if (!isLighOn) {
                if (camera == null || params == null) {
                  return;
                }
                params = camera.getParameters();
                params.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
                camera.setParameters(params);
                camera.startPreview();
                isLighOn = true;

                toggleBgImage();
            }

      }

      // Turning Off flash
      private void turnOffFlash() {

            if (isLighOn) {
                if (camera == null || params == null) {
                  return;
                }

                params = camera.getParameters();
                params.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
                camera.setParameters(params);
                camera.stopPreview();
                isLighOn = false;

                toggleBgImage();
            }
      }

      private void toggleBgImage() {
            if (isLighOn) {
                bg.setImageResource(R.mipmap.f_on);
            } else {
                bg.setImageResource(R.mipmap.f_off);
            }
      }

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

      }

      @Override
      public void surfaceDestroyed(SurfaceHolder holder) {
            if (camera != null) {
                camera.stopPreview();
                camera.setPreviewCallback(null);
                camera.release();
                camera = null;
            }
      }

      @Override
      public void surfaceCreated(SurfaceHolder holder) {
            if (camera == null) {
                camera = Camera.open();
                params = camera.getParameters();
                try {
                  camera.setPreviewDisplay(holder);
                } catch (IOException e) {
                  camera.release();
                  camera = null;
                }
            }

            turnOnFlash();
      }

    }


}fragment_main_activity.xml<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

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

    <ImageView
      android:id="@+id/flashlight_bg"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:src="@mipmap/f_on"
      android:scaleType="centerCrop"
      />

    <ImageButton
      android:id="@+id/flashlight_button"
      android:layout_width="100dp"
      android:layout_height="200dp"
      android:layout_centerInParent="true"
      android:background="@android:color/transparent"
      android:text="fuck"/>

</RelativeLayout>activity_main.xml<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
             android:id="@+id/container"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             />AndroidManifest.xml<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.liujinghuiuncleapp.app.tool.flashlight" >

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

    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.camera.flash" />

    <application
      android:allowBackup="true"
      android:icon="@mipmap/ic_launcher"
      android:theme="@style/AppTheme"
      android:label="@string/app_name" >
      <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
      </activity>
    </application>

</manifest>
页: [1]
查看完整版本: 通用型手电筒 Android 代码 转发