Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android應用實例之——基於BroadCastReceiver的SD卡裝載卸載實例

Android應用實例之——基於BroadCastReceiver的SD卡裝載卸載實例

編輯:Android開發實例

今天給大家分享的是基於BroadCastReceiver的SD卡裝載卸載實例.

    Android設備默認的是當我們插上USB和電腦相連接時,在Android設備狀態欄上會發一條通知信息,當我們點擊這條消息時,會出現一個對話框有"裝載SD卡"和"取消"兩個按鈕,當我們點擊裝載時,我們的SD卡將會變成U盤一樣,我們通過電腦可以對SD卡進行操作。

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

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

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

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

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

  

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

 

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  3.     android:orientation="vertical" 
  4.     android:layout_width="fill_parent" 
  5.     android:layout_height="fill_parent" 
  6.     > 
  7.     <ImageView 
  8.         android:paddingTop="10px" 
  9.         android:id="@+id/usbstatus" 
  10.         android:layout_width="fill_parent"   
  11.         android:layout_height="wrap_content"   
  12.         android:src="@drawable/usb_android" 
  13.     /> 
  14.       
  15.     <LinearLayout 
  16.     android:orientation="horizontal" 
  17.     android:layout_width="fill_parent" 
  18.     android:layout_height="wrap_content" 
  19.     android:layout_gravity="bottom" 
  20.     android:paddingTop="30px" 
  21.     > 
  22.         <ToggleButton 
  23.         android:id="@+id/mountsdcard" 
  24.         android:layout_width="wrap_content"   
  25.         android:layout_height="wrap_content"   
  26.         android:layout_weight="1" 
  27.         android:textOn="卸載SD卡" 
  28.         android:textOff="裝載SD卡" 
  29.         /> 
  30.         <ToggleButton 
  31.         android:id="@+id/cancel" 
  32.         android:layout_width="wrap_content"   
  33.         android:layout_height="wrap_content"   
  34.         android:layout_weight="1" 
  35.         android:textOff="取消" 
  36.         android:textOn="取消" 
  37.         /> 
  38.     </LinearLayout> 
  39. </LinearLayout> 

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

 

  1. package com.smit.usbstorage;  
  2. import android.content.BroadcastReceiver;  
  3. import android.content.Context;  
  4. import android.content.Intent;  
  5. public class UsbBroadCastRecevier extends BroadcastReceiver {  
  6.     @Override 
  7.     public void onReceive(Context context, Intent intent) {  
  8.         // TODO Auto-generated method stub  
  9.         String action = intent.getAction();  
  10.         //當插上USB後啟動UsbStorageActivity  
  11.         if(action.equals(Intent.ACTION_UMS_CONNECTED)){  
  12.               
  13.             final Intent mIntent = new Intent();  
  14.             mIntent.setClass(context, UsbStorageActivity.class);  
  15.             mIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
  16.             context.startActivity(mIntent);  
  17.         }  
  18.     }  
  19.           
  20. }  

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

 

  1. package com.smit.usbstorage;  
  2. import android.app.Activity;  
  3. import android.content.BroadcastReceiver;  
  4. import android.content.Context;  
  5. import android.content.Intent;  
  6. import android.content.IntentFilter;  
  7. import android.os.Bundle;  
  8. import android.view.View;  
  9. import android.view.View.OnClickListener;  
  10. import android.widget.ImageView;  
  11. import android.widget.Toast;  
  12. import android.widget.ToggleButton;  
  13. import com.smit.usbstorage.R;  
  14. public class UsbStorageActivity extends Activity implements OnClickListener{  
  15.       
  16.     private ImageView mImageView;  
  17.     private ToggleButton mMountSdcard;  
  18.     private ToggleButton mCancel;  
  19.     //定義一個BroadcastReceiver當接收拔掉USB廣播後,關閉當前Activity  
  20.     private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {  
  21.         @Override 
  22.         public void onReceive(Context context, Intent intent) {  
  23.             String action = intent.getAction();           
  24.             if(action.equals(Intent.ACTION_UMS_DISCONNECTED)){  
  25.                 finish();  
  26.             }             
  27.         }  
  28.     };  
  29.     @Override 
  30.     public void onCreate(Bundle savedInstanceState) {  
  31.         super.onCreate(savedInstanceState);  
  32.         setContentView(R.layout.main);  
  33.         setupViews();  
  34.     }  
  35.       
  36.     //初始化工作  
  37.     private void setupViews(){  
  38.         mImageView = (ImageView)findViewById(R.id.usbstatus);  
  39.         mMountSdcard = (ToggleButton)findViewById(R.id.mountsdcard);  
  40.         mCancel = (ToggleButton)findViewById(R.id.cancel);  
  41.         //判斷Sdcard是否存在,不存在按鈕不可用  
  42.         if(!sdcardIsMounted()){  
  43.             mMountSdcard.setEnabled(false);  
  44.         }  
  45.         mMountSdcard.setOnClickListener(this);  
  46.         mCancel.setOnClickListener(this);  
  47.           
  48.         //代碼中注冊BroadCastReceiver  
  49.         IntentFilter mIntentFilter = new IntentFilter();  
  50.         mIntentFilter.addAction(Intent.ACTION_UMS_DISCONNECTED);  
  51.         registerReceiver(mBroadcastReceiver, mIntentFilter);  
  52.     }  
  53.   //判斷SD卡是否存在  
  54.     public boolean sdcardIsMounted(){  
  55.         if (android .os.Environment.getExternalStorageState().equals(  
  56.                 android.os.Environment.MEDIA_MOUNTED)){  
  57.             return true;  
  58.         }else{  
  59.             return false;  
  60.         }  
  61.     }  
  62.       
  63.       
  64.     private boolean usbIsMounted(){  
  65.         boolean res = false;  
  66.         if(mMountSdcard.isChecked()){  
  67.             res = true;  
  68.         }  
  69.         return res;  
  70.     }  
  71.       
  72.     private void toggleMountSdcard(){  
  73.         if(mMountSdcard.isChecked()){  
  74.             mountAsUsbStorage();  
  75.         }else{  
  76.             stopUsbStorage();  
  77.         }  
  78.     }  
  79.       
  80.     //裝載SD卡方法,我這裡就沒有具體實現  
  81.     private void mountAsUsbStorage() {  
  82.        Toast.makeText(this, "SD卡被裝載", Toast.LENGTH_LONG).show();  
  83.     }  
  84.       
  85.     //卸載SD卡方法  
  86.     private void stopUsbStorage() {  
  87.         Toast.makeText(this, "SD卡被卸載", Toast.LENGTH_LONG).show();  
  88.     }  
  89.           
  90.     public void onClick(View v) {  
  91.         if(v == mMountSdcard){  
  92.             toggleMountSdcard();  
  93.             if(usbIsMounted()){  
  94.                 mImageView.setImageResource(R.drawable.usb_android_connected);  
  95.             }else{  
  96.                 mImageView.setImageResource(R.drawable.usb_android);  
  97.             }  
  98.         }else if(v == mCancel){  
  99.             finish();  
  100.         }  
  101.     }  
  102.           

第五步:修改AndroidManifest.xml文件,代碼如下:

 

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
  3.       package="com.smit.usbstorage" 
  4.       android:versionCode="1" 
  5.       android:versionName="1.0"> 
  6.     <application android:icon="@drawable/icon" android:label="@string/app_name"> 
  7.         <activity android:name=".UsbStorageActivity" 
  8.                   android:theme="@android:style/Theme.NoTitleBar" 
  9.                   android:label="@string/app_name"> 
  10.             <intent-filter> 
  11.                 <action android:name="android.intent.action.MAIN" /> 
  12.                 <category android:name="android.intent.category.LAUNCHER" /> 
  13.             </intent-filter> 
  14.         </activity> 
  15.          <receiver android:name=".UsbBroadCastRecevier"> 
  16.             <intent-filter> 
  17.                 <action android:name="android.intent.action.UMS_CONNECTED"></action> 
  18.             </intent-filter> 
  19.         </receiver> 
  20.     </application> 
  21.     <uses-sdk android:minSdkVersion="7" /> 
  22. </manifest>  

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

點擊裝載SD卡按鈕:

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

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

 

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

不信大家可以試試。lol~

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved