2011-06-09 14 views
7

SD kartın çıkarılması için bir alıcı kaydettirmeye çalışıyorum ancak alıcım kod kartımı buraya yapıştırdığım SD kartın kaldırılmasını istemiyor. Alıcıyı oncreate() dosyasına kaydediyorum ve ondestroy işlevinde kayıtsız bırakıyorum. Eğer bir hata yaparsam lütfen bana bildirin.SD Kartla ilgili niyetleri yayın alıcımla almıyorum

void registerSDCardStateChangeListener() { 
    final String MEDIA_REMOVED = "android.intent.action.MEDIA_REMOVED"; 
    final String MEDIA_UNMOUNTED = "android.intent.action.MEDIA_UNMOUNTED"; 
    final String MEDIA_BAD_REMOVAL = "android.intent.action.MEDIA_BAD_REMOVAL"; 
    //  final String MEDIA_EJECT = "android.intent.action.MEDIA_EJECT"; 
    final String MEDIA_EJECT = "android.intent.action.MEDIA_SCANNER_FINISHED"; 

    mSDCardStateChangeListener = new BroadcastReceiver() { 

     @ 
     Override 
     public void onReceive(Context context, Intent intent) { 
      String action = intent.getAction(); 
      if (action.equalsIgnoreCase(MEDIA_REMOVED) || action.equalsIgnoreCase(MEDIA_UNMOUNTED) || action.equalsIgnoreCase(MEDIA_BAD_REMOVAL) || action.equalsIgnoreCase(MEDIA_EJECT)) { 
       if (mMediaPlayer != null) { 
        stopPlayBack(); 
       } 
      } 
     } 
    }; 

    IntentFilter filter = new IntentFilter(); 
    filter.addAction(MEDIA_REMOVED); 
    filter.addAction(MEDIA_UNMOUNTED); 
    filter.addAction(MEDIA_BAD_REMOVAL); 
    filter.addAction(MEDIA_EJECT); 
    registerReceiver(mSDCardStateChangeListener, filter); 
} 

Lütfen kodumda bir sorun varsa lütfen bana bildirin. Eğer niyet filtre

filter.addDataScheme("file"); 

bu ekleme

cevap

24

deneyin Size niyet veri alanı olarak yolunu göndermek yakalamaya çalışıyoruz eylemleri görünür. Bu durumda, niyet filtreniz eşleşen şemaya sahip olmalıdır.

Son olarak, bu yalnızca bir öneridir, ancak eylemlerinizi el ile yazmak yerine Sabitler'i Intent sınıfında kullanmanızı öneririm. IE, doğrudan dizeyi kullanarak Intent.ACTION_MEDIA_REMOVED kullanın.

+0

Cevabınız için çok teşekkür ederim, cevabınız için – Suman

+0

@Justin Breitfeller + 1 çalıştı. –

3

Justin Breitfeller cevabı benim için çalıştı, ancak alternatif bir teknik olarak, ayrıca AndroidManifest.xml tamamen bunu yapabilirsiniz:

public class OnMediaMountedReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     String action = intent.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)) { 
      if(mMediaPlayer != null) { 
       stopPlayBack(); 
      } 
     }    
    } 
}; 
0
:

<receiver android:enabled="true" android:exported="false" 
    android:name="SDCardStateChangeListener"> 
    <intent-filter> 
    <action android:name="android.intent.action.MEDIA_UNMOUNTED" /> 
    <action android:name="android.intent.action.MEDIA_REMOVED" /> 
    <action android:name="android.intent.action.MEDIA_EJECT" /> 
    <action android:name="android.intent.action.MEDIA_BAD_REMOVAL" /> 
    <data android:scheme="file" /> 
    </intent-filter> 
</receiver> 

Ardından alıcıyı düzgün bir sınıf oluşturun

Uygulama çalışırken ve kullanıcı bağlantısını kaldırırken/sdcard kaldırırken çözümler buldum.

@Override 
protected void onResume() { 
    super.onStart(); 

    IntentFilter ejectFilter = new ntentFilter(Intent.ACTION_MEDIA_MOUNTED); 
    ejectFilter.addAction(Intent.ACTION_MEDIA_UNMOUNTED); 
    ejectFilter.addAction(Intent.ACTION_MEDIA_EJECT); 
    ejectFilter.addDataScheme("file"); 
    registerReceiver(ejectReceiver, ejectFilter); 

} 

@Override 
protected void onPause() { 
    super.onPause(); 

    unregisterReceiver(ejectReceiver); 
} 

sınıfında,

BroadcastReceiver ejectReceiver = new BroadcastReceiver() 
{    
     @Override 
    public void onReceive(Context context, Intent intent) { 
     final String action = intent.getAction(); 

     if (action.equals(Intent.ACTION_MEDIA_EJECT) || action.equals(Intent.ACTION_MEDIA_UNMOUNTED)) 
     { 
      Log.e("msg","Media Unmounted"); 

      //do something on unmounted sdcard from device 
     } 
    } 
}; 

yararlı olacaktır Umut, aşağıda gibi yöntemini tanımlar.