要把檔案寫到sdcard裡去
至於怎麼寫,這裡就不多說
在寫檔之前,好的programmer一定要注意到防呆!
就是detect sdcard的狀態
是否有被mount上去?
之前都直接寫一個function去取得目前sdcard的狀態,如下
private static final boolean fnIsSDcard(){
return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
}
但是在我的需求中,這種寫法會有問題,
因為我的檔案較大,在寫的過程中會耗費比較久的時間,
如果在寫檔的過程中,sdcard被unmounted了! 很好,這個process會被killed掉!
因為這是process中有參照到sdcard裡的位置,所以android os會強制kill掉!
所以我就在想...sdcard有沒有event listener啊??
但是沒有,所以我透過Service和BroadcastReceiver去實作
首先先新增一個class,然後要extends Service,如下
public class serviceSDcard extends Service {
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onStart(Intent intent, int startId) {
//新增一個IntentFilter
IntentFilter intentFilter = new IntentFilter();
//並且新增兩個action,告知此 service什麼時候的動作才要通知你
intentFilter.addAction(Intent.ACTION_MEDIA_MOUNTED); //如果sdcard被掛載上去時通知
intentFilter.addAction(Intent.ACTION_MEDIA_UNMOUNTED); //如果sdcard被卸載時通知
intentFilter.addDataScheme("file");
intentFilter.addDataAuthority("*", null);
registerReceiver(receiver, intentFilter); //註冊一個BroadcastReceiver
super.onStart(intent, startId);
}
private BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
try {
if (intent.getAction().equals(Intent.ACTION_MEDIA_UNMOUNTED)){
//sdcard被卸載時的動作
}else{
//sdcard被掛載時的動作
}
} catch (Exception e) {
Log.d("main", e.toString());
}
}
};
}
一個Service就完成了,現在就要把Service啟動!
在主要執行的activity中去startService();,如下
public class main extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Intent intent = new Intent(this,serviceSDcard.class);
startService(intent);
}
}
這樣就完成啦! 記得要在manifest.xml中新增一個service喔!!如下:
<service android:name=".serviceSDcard"></service>