您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關Android手電筒如何兼容各個手機與版本的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
在寫手電筒APP之前,當然已經參考market上的很多手電筒APP,還有網上如何實現手電筒功能的各種源碼。不管是源碼還是market上的APP,總結了幾點的問題。
1.我下載market上的所有手電筒APP都是通過Camera打開閃光燈的方式來實現的,但是大部分APP在打開Camera時沒有進行異常處理工作,也沒有任何的提示,如果當其他的程序在使用Camera時,并且返回或點Home后沒有釋放Camera,這時在啟動相應的手電筒APP就會出現崩潰或者手電筒功能已經失效,這種用戶體驗用戶是不能接受的!
2,網上很多Camera打開閃光燈實現手電筒的源碼,而且原理都是一樣的,當然這些代碼并沒有錯誤,但存在的問題是這些源碼在有的手機版本上能夠實現相應的功能,在另外的手機版本上就不起作用了,在CSDN資源中的大部分手電筒Demo也都會存在此問題,兼容性不好!
我自己實現的這個手電筒很簡單,沒有任何的UI界面,進入APP后就直接照明,實現的原理就2點:
1.跟其他手電筒APP一樣,用Camera打開閃光燈開始照明
2.將當前屏幕的背光調節為最亮狀態,退出時在恢復之前的背光值
代碼和布局如下:
MainActivity.java
package huahua.flashlight; import java.io.IOException; import android.app.Activity; import android.content.ContentResolver; import android.content.pm.FeatureInfo; import android.content.pm.PackageManager; import android.hardware.Camera; import android.os.Bundle; import android.provider.Settings; import android.provider.Settings.SettingNotFoundException; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.Window; import android.view.WindowManager; import android.widget.Toast; /** * 花花手電筒 * @author huahua */ public class MainActivity extends Activity implements SurfaceHolder.Callback{ private static final String TAG = "huahua"; /** * 進入APP時的背光亮度值 */ int normal; /** * 進入APP時,是否為自動調節亮度狀態 */ boolean AutoBrightnessOpen = false; private Camera camera; private SurfaceView surfaceView; private SurfaceHolder surfaceHolder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //去除title this.requestWindowFeature(Window.FEATURE_NO_TITLE); //去掉Activity上面的狀態欄 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.activity_main); surfaceView = (SurfaceView) this.findViewById(R.id.surfaceview); surfaceHolder = surfaceView.getHolder(); surfaceHolder.addCallback(this); surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); if(isAutoBrightness(getContentResolver())) { AutoBrightnessOpen = true; } normal = Settings.System.getInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS, 255); PackageManager pm= this.getPackageManager(); FeatureInfo[] features=pm.getSystemAvailableFeatures(); for(FeatureInfo f : features) { if(PackageManager.FEATURE_CAMERA_FLASH.equals(f.name)) //判斷設備是否支持閃光燈 { Log.d("huahua","支持閃光燈"); } } } @Override protected void onPause() { // TODO Auto-generated method stub super.onPause(); Closeshoudian(); } @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); Openshoudian(); } /** * 判斷是否開啟了自動亮度調節 * * @param aContext * @return */ public boolean isAutoBrightness(ContentResolver aContentResolver) { boolean automicBrightness = false; try { automicBrightness = Settings.System.getInt(aContentResolver, Settings.System.SCREEN_BRIGHTNESS_MODE) == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC; } catch (SettingNotFoundException e) { e.printStackTrace(); } return automicBrightness; } /** * 停止自動亮度調節 * * @param activity */ public void stopAutoBrightness(Activity activity) { Settings.System.putInt(activity.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE, Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL); } /** * 恢復自動亮度調節 * * @param activity */ public void setAutoBrightness(Activity activity) { Settings.System.putInt(activity.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE, Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC); } /** * 打開手電筒 */ public void Openshoudian() { //異常處理一定要加,否則Camera打開失敗的話程序會崩潰 try { Log.d("huahua","camera打開"); camera = Camera.open(); } catch (Exception e) { Log.d("huahua","Camera打開有問題"); Toast.makeText(MainActivity.this, "Camera被占用,請先關閉", Toast.LENGTH_SHORT).show(); } if(camera != null) { //打開閃光燈 camera.startPreview(); Camera.Parameters parameter = camera.getParameters(); parameter.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH); camera.setParameters(parameter); Log.d("huahua","閃光燈打開"); //先關閉自動調節背光功能,才可以調節背光 if(AutoBrightnessOpen) { stopAutoBrightness(MainActivity.this); } //將背光設置為最亮 WindowManager.LayoutParams lp = getWindow().getAttributes(); lp.screenBrightness = Float.valueOf(255) * (1f / 255f); getWindow().setAttributes(lp); } } /** * 關閉手電筒 */ public void Closeshoudian() { if (camera != null) { //關閉閃光燈 Log.d("huahua", "closeCamera()"); camera.getParameters().setFlashMode(Camera.Parameters.FLASH_MODE_OFF); camera.setParameters(camera.getParameters()); camera.stopPreview(); camera.release(); camera = null; //恢復進入程序前的背光值 WindowManager.LayoutParams lp = getWindow().getAttributes(); lp.screenBrightness = Float.valueOf(normal) * (1f / 255f); getWindow().setAttributes(lp); //如果進入APP時背光為自動調節,則退出時需要恢復為自動調節狀態 if(AutoBrightnessOpen) { setAutoBrightness(MainActivity.this); } } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // TODO Auto-generated method stub } @Override public void surfaceCreated(SurfaceHolder holder) { try { if(camera != null) { camera.setPreviewDisplay(holder); } } catch (IOException e) { e.printStackTrace(); } } @Override public void surfaceDestroyed(SurfaceHolder holder) { // TODO Auto-generated method stub } }
activity_main.xmlactivity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity" > <SurfaceView android:id="@+id/surfaceview" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#FFFFFF"/> </LinearLayout>
感謝各位的閱讀!關于“Android手電筒如何兼容各個手機與版本”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。