編輯: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布局文件,代碼如下:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- <ImageView
- android:paddingTop="10px"
- android:id="@+id/usbstatus"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:src="@drawable/usb_android"
- />
- <LinearLayout
- android:orientation="horizontal"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_gravity="bottom"
- android:paddingTop="30px"
- >
- <ToggleButton
- android:id="@+id/mountsdcard"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:textOn="卸載SD卡"
- android:textOff="裝載SD卡"
- />
- <ToggleButton
- android:id="@+id/cancel"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:textOff="取消"
- android:textOn="取消"
- />
- </LinearLayout>
- </LinearLayout>
第三步:新建一個BroadcastReceiver,命名為UsbBroadCastRecevier.java,代碼如下:
- package com.smit.usbstorage;
- import android.content.BroadcastReceiver;
- import android.content.Context;
- import android.content.Intent;
- public class UsbBroadCastRecevier extends BroadcastReceiver {
- @Override
- public void onReceive(Context context, Intent intent) {
- // TODO Auto-generated method stub
- String action = intent.getAction();
- //當插上USB後啟動UsbStorageActivity
- if(action.equals(Intent.ACTION_UMS_CONNECTED)){
- final Intent mIntent = new Intent();
- mIntent.setClass(context, UsbStorageActivity.class);
- mIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- context.startActivity(mIntent);
- }
- }
- }
第四步:修改主核心程序UsbStorageActivity.java代碼如下:
- package com.smit.usbstorage;
- import android.app.Activity;
- import android.content.BroadcastReceiver;
- import android.content.Context;
- import android.content.Intent;
- import android.content.IntentFilter;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.ImageView;
- import android.widget.Toast;
- import android.widget.ToggleButton;
- import com.smit.usbstorage.R;
- public class UsbStorageActivity extends Activity implements OnClickListener{
- private ImageView mImageView;
- private ToggleButton mMountSdcard;
- private ToggleButton mCancel;
- //定義一個BroadcastReceiver當接收拔掉USB廣播後,關閉當前Activity
- private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- String action = intent.getAction();
- if(action.equals(Intent.ACTION_UMS_DISCONNECTED)){
- finish();
- }
- }
- };
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- setupViews();
- }
- //初始化工作
- private void setupViews(){
- mImageView = (ImageView)findViewById(R.id.usbstatus);
- mMountSdcard = (ToggleButton)findViewById(R.id.mountsdcard);
- mCancel = (ToggleButton)findViewById(R.id.cancel);
- //判斷Sdcard是否存在,不存在按鈕不可用
- if(!sdcardIsMounted()){
- mMountSdcard.setEnabled(false);
- }
- mMountSdcard.setOnClickListener(this);
- mCancel.setOnClickListener(this);
- //代碼中注冊BroadCastReceiver
- IntentFilter mIntentFilter = new IntentFilter();
- mIntentFilter.addAction(Intent.ACTION_UMS_DISCONNECTED);
- registerReceiver(mBroadcastReceiver, mIntentFilter);
- }
- //判斷SD卡是否存在
- public boolean sdcardIsMounted(){
- if (android .os.Environment.getExternalStorageState().equals(
- android.os.Environment.MEDIA_MOUNTED)){
- return true;
- }else{
- return false;
- }
- }
- private boolean usbIsMounted(){
- boolean res = false;
- if(mMountSdcard.isChecked()){
- res = true;
- }
- return res;
- }
- private void toggleMountSdcard(){
- if(mMountSdcard.isChecked()){
- mountAsUsbStorage();
- }else{
- stopUsbStorage();
- }
- }
- //裝載SD卡方法,我這裡就沒有具體實現
- private void mountAsUsbStorage() {
- Toast.makeText(this, "SD卡被裝載", Toast.LENGTH_LONG).show();
- }
- //卸載SD卡方法
- private void stopUsbStorage() {
- Toast.makeText(this, "SD卡被卸載", Toast.LENGTH_LONG).show();
- }
- public void onClick(View v) {
- if(v == mMountSdcard){
- toggleMountSdcard();
- if(usbIsMounted()){
- mImageView.setImageResource(R.drawable.usb_android_connected);
- }else{
- mImageView.setImageResource(R.drawable.usb_android);
- }
- }else if(v == mCancel){
- finish();
- }
- }
- }
第五步:修改AndroidManifest.xml文件,代碼如下:
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.smit.usbstorage"
- android:versionCode="1"
- android:versionName="1.0">
- <application android:icon="@drawable/icon" android:label="@string/app_name">
- <activity android:name=".UsbStorageActivity"
- android:theme="@android:style/Theme.NoTitleBar"
- android:label="@string/app_name">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- <receiver android:name=".UsbBroadCastRecevier">
- <intent-filter>
- <action android:name="android.intent.action.UMS_CONNECTED"></action>
- </intent-filter>
- </receiver>
- </application>
- <uses-sdk android:minSdkVersion="7" />
- </manifest>
第六步:運行上述工程,當我們插上USB後啟動UsbStorageActivity,效果如下:
點擊裝載SD卡按鈕:
當拔掉USB或者點擊取消按鈕,該應用關閉。
當然我們這個應用如果按以上方法是必然出現在應用列表中的,而這個應用只能是在插上USB後才啟動,用戶不能自啟動,所以我們需要將這個應用隱藏起來,這裡其實很簡單,只要將第五步中的第12行代碼去掉即可,即:
- <category android:name="android.intent.category.LAUNCHER" />
不信大家可以試試。lol~
本文將引導大家做一個音樂播放器,在做這個Android開發實例的過程中,能夠幫
Android提供了許多方法來控制播放的音頻/視頻文件和流。其中該方法是通過一類稱為MediaPlayer。Android是提供MediaPlayer類訪問內置的媒體播放
可以顯示在的Android任務,通過加載進度條的進展。進度條有兩種形狀。加載欄和加載微調(spinner)。在本章中,我們將討論微調(spinner)。Spinner 用
JSON代表JavaScript對象符號。它是一個獨立的數據交換格式,是XML的最佳替代品。本章介紹了如何解析JSON文件,並從中提取所需的信息。Android提供了四個