1. 程式人生 > >Andriod-手電筒應用小思路(二)

Andriod-手電筒應用小思路(二)

在上一篇文章Android-手電筒應用小思路(一)中提到的是獨立手電筒App應用,然而第三方的手電筒應用是有缺陷的。因為如果讓第三方手電筒app在後臺亮,然後進入照相機,照相機是不能開啟的。因為Camera是共享的硬體,但是不支援多個應用同時使用Camera,最起碼,Android設計這塊的初衷是這樣的。

        所以就想針對這點做點什麼,當然不能像小米系統自帶的手電筒那麼叼。但是我的做法也能讓手電筒亮著,然後進照相機應用,而不會影響照相機的執行。當然我的做法只適合方案公司。

        其實我的想法比較簡單,就是在進入照相機應用的時候,如果閃光燈亮著,就關閉手電筒。要做的這一點,我把手電筒寫在Camera裡面,這樣就可以在Camera應用中獲得手電筒應用的Activity的物件例項,從而更好的控制兩者之間使用Camera 硬體的情況。當然你也許會說,通過廣播來發送相關的資訊,當然也是可以,但那時廣播有時候也是會延遲的,所以會存在弊端。

        既然要將手電筒放在Camera應用裡面就要修改Camera應用。首先在其中增加Android-手電筒應用小思路(一)中所寫的TorchActivity.java。然後修改其配置檔案,增加下列程式碼:

<activity
		    android:name="com.android.camera.TorchActivity" 
		    android:label="@string/torch_title"
		    android:screenOrientation="portrait"
		    android:clearTaskOnLaunch="true"
		    >
		</activity>
		
		<activity-alias
		     android:name="com.android.camera.TorchLauncher"
		     android:icon="@mipmap/ic_launcher_torch"
		     android:label="@string/torch_title"
		     android:targetActivity="com.android.camera.TorchActivity">
		     <intent-filter>
		        <action android:name="android.intent.action.MAIN" />

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

然後修改TorchActivity.java,增加下面程式碼:
	  ...
public static TorchActivity mInstance;
	  ...
public static TorchActivity getInstance(){
    	return mInstance;
}

再修改CameraActivity.java,在onCreate()和onResume()增加下面程式碼:

 public void onCreate(Bundle state) {
 	if(TorchActivity.getInstance()!= null && TorchActivity.getInstance().torchstate){
	            TorchActivity.getInstance().releaseTorch();
	            TorchActivity.getInstance().finish();
	 }
 	...
 }

 public void onResume() {
 	if(TorchActivity.getInstance()!= null && TorchActivity.getInstance().torchstate){
	            TorchActivity.getInstance().releaseTorch();
	            TorchActivity.getInstance().finish();
	 }
 	...
 }

重新編譯Camera 然後push到手機後,你會發現,Launcher上有了手電筒的圖示,這也就是一個應用兩個ICON圖示,充分利用activity-alias。