程序启动的时候打开sd卡上面的一个文件, 在关闭该文件之前(不管有没有读写操作),卸载sd卡(通过“打开USB存储设备”方式,SD卡在PC上可见)时,程序自动关闭,force close对话框都没有。
  
   大家看看有没有什么好的方法来处理这个问题,只要能保证这个时候程序不会自动关闭即可。   谢谢。

解决方案 »

  1.   


    就是创建一个activity的项目,在onCreate()里面加了如下代码: File file = new File(
    android.os.Environment.getExternalStorageDirectory(),
    "Text.log.txt");
    try {
    FileOutputStream fileOutputStream = new FileOutputStream(file, true);
    } catch (FileNotFoundException e) {
    e.printStackTrace();
    }
      

  2.   

    监听SD卡相关的广播,sdcard状态改变时通知应用程序,或者每次操作sdcard判断一下sdcard是否存在
    android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)
    SdcardReceiver = new BroadcastReceiver() 
    {
       @Override
            public void onReceive(Context context, Intent intent) {
             if(intent.getAction().equals(Intent.ACTION_MEDIA_SHARED)){
                do somethings
             }
             else if(intent.getAction().equals(Intent.ACTION_MEDIA_EJECT)){
                do somethings
             }
             ....
    }
    创建时注册广播
    IntentFilter intentFilter = new IntentFilter(Intent.ACTION_MEDIA_MOUNTED);
    intentFilter.addAction(Intent.ACTION_MEDIA_UNMOUNTED);
    intentFilter.addAction(Intent.ACTION_MEDIA_REMOVED);
    //intentFilter.addAction(Intent.ACTION_MEDIA_SHARED);
    intentFilter.addAction(Intent.ACTION_MEDIA_BAD_REMOVAL);
    //intentFilter.addAction(Intent.ACTION_MEDIA_SCANNER_STARTED);
    //intentFilter.addAction(Intent.ACTION_MEDIA_SCANNER_FINISHED);
    intentFilter.addDataScheme(“file”);
    registerReceiver(SdcardReceiver , intentFilter);程序结束
     unregisterReceiver(SdcardReceiver);  
      

  3.   

    一楼的方法会抛出异常,导致弹出对话框,force close的
    还是二楼的方法好,需要监听SD卡的状态,然后给出相应的处理
      

  4.   

    我想 知道仅仅这样就可以解决插拔SD卡程序关闭问题? LZ你确认解决了么?
    SD卡上打开一个文件,是普通文本文件还是mp3、mp4类文件是不一样的吧。还有即使监听到了,处理响应怎么写?不让退? 我播放着一半的mp3没了也能播?
      

  5.   

    我也想知道,确实 即使收到也可能异常了,一般的用try catch就不会自动关闭了,还是不行试试定义个Service,在xml里可以设 process 属性可以分配单独进程。
      

  6.   


    有没有办法禁止在系统中卸载SD卡?也就是说希望能做到要卸载SD卡只有关闭把物理卡取走这个途径。不考虑定制系统这个情况。
      

  7.   

        通过监听“android.intent.action.MEDIA_SHARED”广播,可以在打开USB存储设备时候,造成的SD卸载。
         通过监听“android.intent.action.MEDIA_BAD_REMOVAL”广播,可以监听到SD卡的拔出操作。如果考虑到音乐文件播放等问题,在真机上由于缓存的存在,在SD卡拔出后,一般都能再播放音乐10~30秒不等的时间(具体时间看机器配置而定)。在接收到“android.intent.action.MEDIA_BAD_REMOVAL”广播后,马上停止音乐播放应该可以防止AP崩溃。
      

  8.   

    通过监听“android.intent.action.MEDIA_SHARED”广播,可以在打开USB存储设备时候,造成的SD卸载。
      

  9.   

    如果定义一个service, 在xml里配置process号,在logcat里会有这样一条日志,process xxx has died,表示程序crash了,即使在读写时使用try..catch也没有用。还是想问如何才能在读写过程中卸载sd卡,并能保证程序不crash?