2011-09-26 3 views
5

메신저 : android: how to listen to "sd card removed unexpectedly" 하지만 수신자의 onReceive가 호출되지 않습니다. sdcard가 마운트되어 있지 않거나 sdcard를 제거하지 않았습니다. 다음은 코드입니다.청취자가 sd 카드를 제거하기 위해

public class MyClass1 extends Activity{ 
    BroadcastReceiver mSDCardStateChangeListener = null; 
    /** Called when the activity is first created. */ 
    public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    mSDCardStateChangeListener = MyClass2.registerSDCardStateChangeListener(this); 
    //some code which needs SDCard and throws unhandled exception if sdcard is not there 

} 

@Override 
    protected void onDestroy() 
    { 
     MyClass2.unRegisterSDCardStateChangeListener(this, mSDCardStateChangeListener); 
     super.onDestroy(); 
    } 



//in MyClass2 
public static BroadcastReceiver registerSDCardStateChangeListener(Activity act) { 

     BroadcastReceiver mSDCardStateChangeListener = new BroadcastReceiver() { 

      @Override 
      public void onReceive(Context arg0, Intent arg1) { 
       String action = arg1.getAction(); 
        if(action.equalsIgnoreCase(Intent.ACTION_MEDIA_REMOVED) 
          || action.equalsIgnoreCase(Intent.ACTION_MEDIA_UNMOUNTED) 
          || action.equalsIgnoreCase(Intent.ACTION_MEDIA_BAD_REMOVAL) 
          || action.equalsIgnoreCase(Intent.ACTION_MEDIA_EJECT)) 
        { 
         //i never come here ;(
        //do something 

        } 

      } 
     }; 
     IntentFilter filter = new IntentFilter(); 
     filter.addAction(Intent.ACTION_MEDIA_REMOVED); 
     filter.addAction(Intent.ACTION_MEDIA_UNMOUNTED); 
     filter.addAction(Intent.ACTION_MEDIA_BAD_REMOVAL); 
     filter.addAction(Intent.ACTION_MEDIA_EJECT); 
     filter.addDataScheme("file"); 
     act.registerReceiver(mSDCardStateChangeListener, filter); 
     return mSDCardStateChangeListener; 
} 

public static void unRegisterSDCardStateChangeListener(Activity act, BroadcastReceiver mSDCardStateChangeListener) 
    { 
     act.unregisterReceiver(mSDCardStateChangeListener); 
    } 

SDCARD이 경우 에 의해 존재인지 아닌지 내가 확인하지 않으 (android.os.Environment.getExternalStorageState(). 등호 (android.os.Environment.MEDIA_MOUNTED)) 대신 수신기를 사용합니다. 어떤 도움이라도 환영합니다. 감사합니다.

+0

매니페스트 파일에 권한을 설정 했습니까? – Lukap

+0

@Lukap 내 매니 페스트에 android.permission.READ_PHONE_STATE이 (가) –

+0

@ con_9 맞습니다. 죄송합니다. – Caner

답변

3

좋아요 내가 게시 한 코드는 &이 아닌 상태 인 &이 잘 작동한다고 생각합니다. 문서에서

:

android.content.Intent.ACTION_MEDIA_REMOVED 방송 작업 : 외부 미디어가 제거되었습니다. 제거 된 미디어에 대한 탑재 지점의 경로는 Intent.mData 필드에 포함됩니다.

그래서 내가 무엇을 기대하고 있었다 (내가 잘못했다, 질문의 처음 두 행 참조) 내가 SDCard에 (즉, 그 이전에 제거 된)을 해달라고하고 내가 응용 프로그램을 시작하면 나는 전화를받을 것 나는 SDCard를 가지고 있지 않다는 것을 암시한다. 의도는 동작 (및 상태)입니다. 그래서 내가 응용 프로그램이 활성화되어있는 동안 sdcard를 제거하면 콜백을 수신합니다. 시간 내 주셔서 감사합니다.

관련 문제