Android應用執行個體之—-基於BroadCastReceiver的SD卡裝載卸載執行個體!

來源:互聯網
上載者:User

    大家好,經過國慶七天終於又和大家見面了,今天給大家分享的是基於BroadCastReceiver的SD卡裝載卸載執行個體.

    Android裝置預設的是當我們插上USB和電腦相串連時,在Android裝置狀態列上會發一條通知資訊,當我們點擊這條訊息時,會出現一個對話方塊有"裝載SD卡"和"取消"兩個按鈕,當我們點擊裝載時,我們的SD卡將會變成隨身碟一樣,我們通過電腦可以對SD卡進行操作。

    但是我們客戶認為插上USB以後以通知的形式提示使用者,這樣不智能,他們的需求是當我們插入USB後,就會彈出一個視窗,讓使用者選擇裝載SD卡或者不裝載。

   當我拿到這個需求時,我首先想到了去改framework,當framework改得小有模樣時,突然想到自己寫個應用實現這個功能是多麼的簡單,也就是利用到了BroadCastReceiver這個組件,當然我這個應用是整合到了System/app下的,並且是在Launcher應用列表中看不到的。

    BroadCastReceiver是Android中重要的五大組件之一,當然實現BroadCastReceiver有兩種方法:一種是我們寫一個類繼承BroadCastReceiver並在AndroidManifest.xml檔案中註冊;另一種方法是在代碼中直接註冊BroadCastReceiver。

   為了便於大家理解,我簡單寫了一個執行個體,希望對大家有所協助,下面是具體步驟:

   第一步:建立一個Android工程,命名為UsbStorage。目錄結構如下:

  

第二步:修改main.xml布局檔案,代碼如下:

<?xml version="1.0" encoding="utf-8"?><br /><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"<br /> android:orientation="vertical"<br /> android:layout_width="fill_parent"<br /> android:layout_height="fill_parent"<br /> ><br /><ImageView<br />android:paddingTop="10px"<br />android:id="@+id/usbstatus"<br />android:layout_width="fill_parent"<br /> android:layout_height="wrap_content"<br /> android:src="@drawable/usb_android"<br />/></p><p><LinearLayout<br /> android:orientation="horizontal"<br /> android:layout_width="fill_parent"<br /> android:layout_height="wrap_content"<br /> android:layout_gravity="bottom"<br /> android:paddingTop="30px"<br /> ><br /> <ToggleButton<br />android:id="@+id/mountsdcard"<br />android:layout_width="wrap_content"<br /> android:layout_height="wrap_content"<br /> android:layout_weight="1"<br /> android:textOn="卸載SD卡"<br /> android:textOff="裝載SD卡"<br />/><br /><ToggleButton<br />android:id="@+id/cancel"<br />android:layout_width="wrap_content"<br /> android:layout_height="wrap_content"<br /> android:layout_weight="1"<br />android:textOff="取消"<br />android:textOn="取消"<br />/><br /> </LinearLayout><br /></LinearLayout><br />

第三步:建立一個BroadcastReceiver,命名為UsbBroadCastRecevier.java,代碼如下:

package com.smit.usbstorage;<br />import android.content.BroadcastReceiver;<br />import android.content.Context;<br />import android.content.Intent;<br />public class UsbBroadCastRecevier extends BroadcastReceiver {<br />@Override<br />public void onReceive(Context context, Intent intent) {<br />// TODO Auto-generated method stub<br />String action = intent.getAction();<br /> //當插上USB後啟動UsbStorageActivity<br />if(action.equals(Intent.ACTION_UMS_CONNECTED)){</p><p>final Intent mIntent = new Intent();<br />mIntent.setClass(context, UsbStorageActivity.class);<br />mIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);<br />context.startActivity(mIntent);<br />}<br />}</p><p>}<br />

第四步:修改主核心程式UsbStorageActivity.java代碼如下:

package com.smit.usbstorage;<br />import android.app.Activity;<br />import android.content.BroadcastReceiver;<br />import android.content.Context;<br />import android.content.Intent;<br />import android.content.IntentFilter;<br />import android.os.Bundle;<br />import android.view.View;<br />import android.view.View.OnClickListener;<br />import android.widget.ImageView;<br />import android.widget.Toast;<br />import android.widget.ToggleButton;<br />import com.smit.usbstorage.R;<br />public class UsbStorageActivity extends Activity implements OnClickListener{</p><p>private ImageView mImageView;<br /> private ToggleButton mMountSdcard;<br /> private ToggleButton mCancel;<br /> //定義一個BroadcastReceiver當接收拔掉USB廣播後,關閉當前Activity<br /> private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {<br />@Override<br />public void onReceive(Context context, Intent intent) {<br />String action = intent.getAction();<br />if(action.equals(Intent.ACTION_UMS_DISCONNECTED)){<br />finish();<br />}<br />}<br />};<br /> @Override<br /> public void onCreate(Bundle savedInstanceState) {<br /> super.onCreate(savedInstanceState);<br /> setContentView(R.layout.main);<br /> setupViews();<br /> }</p><p> //初始化工作<br /> private void setupViews(){<br /> mImageView = (ImageView)findViewById(R.id.usbstatus);<br /> mMountSdcard = (ToggleButton)findViewById(R.id.mountsdcard);<br /> mCancel = (ToggleButton)findViewById(R.id.cancel);<br /> //判斷Sdcard是否存在,不存在按鈕不可用<br /> if(!sdcardIsMounted()){<br /> mMountSdcard.setEnabled(false);<br /> }<br /> mMountSdcard.setOnClickListener(this);<br /> mCancel.setOnClickListener(this);</p><p> //代碼中註冊BroadCastReceiver<br /> IntentFilter mIntentFilter = new IntentFilter();<br /> mIntentFilter.addAction(Intent.ACTION_UMS_DISCONNECTED);<br /> registerReceiver(mBroadcastReceiver, mIntentFilter);<br /> }<br /> //判斷SD卡是否存在<br />public boolean sdcardIsMounted(){<br />if (android .os.Environment.getExternalStorageState().equals(<br />android.os.Environment.MEDIA_MOUNTED)){<br />return true;<br />}else{<br />return false;<br />}<br />}</p><p>private boolean usbIsMounted(){<br />boolean res = false;<br />if(mMountSdcard.isChecked()){<br />res = true;<br />}<br />return res;<br />}</p><p>private void toggleMountSdcard(){<br />if(mMountSdcard.isChecked()){<br />mountAsUsbStorage();<br />}else{<br />stopUsbStorage();<br />}<br />}</p><p>//裝載SD卡方法,我這裡就沒有具體實現<br />private void mountAsUsbStorage() {<br /> Toast.makeText(this, "SD卡被裝載", Toast.LENGTH_LONG).show();<br /> }</p><p>//卸載SD卡方法<br />private void stopUsbStorage() {<br />Toast.makeText(this, "SD卡被卸載", Toast.LENGTH_LONG).show();<br /> }</p><p>public void onClick(View v) {<br />if(v == mMountSdcard){<br />toggleMountSdcard();<br />if(usbIsMounted()){<br />mImageView.setImageResource(R.drawable.usb_android_connected);<br />}else{<br />mImageView.setImageResource(R.drawable.usb_android);<br />}<br />}else if(v == mCancel){<br />finish();<br />}<br />}</p><p>}

第五步:修改AndroidManifest.xml檔案,代碼如下:

<?xml version="1.0" encoding="utf-8"?><br /><manifest xmlns:android="http://schemas.android.com/apk/res/android"<br /> package="com.smit.usbstorage"<br /> android:versionCode="1"<br /> android:versionName="1.0"><br /> <application android:icon="@drawable/icon" android:label="@string/app_name"><br /> <activity android:name=".UsbStorageActivity"<br /> android:theme="@android:style/Theme.NoTitleBar"<br /> android:label="@string/app_name"><br /> <intent-filter><br /> <action android:name="android.intent.action.MAIN" /><br /> <category android:name="android.intent.category.LAUNCHER" /><br /> </intent-filter><br /> </activity><br /> <receiver android:name=".UsbBroadCastRecevier"><br /> <intent-filter><br /> <action android:name="android.intent.action.UMS_CONNECTED"></action><br /> </intent-filter><br /> </receiver><br /> </application><br /> <uses-sdk android:minSdkVersion="7" /><br /></manifest>

第六步:運行上述工程,當我們插上USB後啟動UsbStorageActivity,效果如下:

點擊裝載SD卡按鈕:

當拔掉USB或者點擊取消按鈕,該應用關閉。

 

當然我們這個應用如果按以上方法是必然出現在應用列表中的,而這個應用只能是在插上USB後才啟動,使用者不能自啟動,所以我們需要將這個應用隱藏起來,這裡其實很簡單,只要將第五步中的第12行代碼去掉即可,即:

<category android:name="android.intent.category.LAUNCHER" />

不信大家可以試試。lol~

Ok,今天晚上就先寫到這裡。大家有什麼疑問的可以留言.....bye~

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.