2012-05-27 42 views
1

有人可以用這個指向我的正確方向嗎?我需要獲取隨機請求的音頻文件。我想我可以通過使用AssetManager來實現這一點,然後使用字符串arry作爲隨機長度的位置。我在OnClickMethod上得到錯誤。這裏是使用LogCat的代碼。隨機AudioFile表格資產文件夾

public class RandomSoundFormAssetsFolder extends Activity implements 
    OnClickListener { 
/** Called when the activity is first created. */ 
MediaPlayer RandomAudioPlayer; 
AssetFileDescriptor descriptor; 
Button playSound; 
String[] filelist; 
AssetManager Agetlist; 
String MediaFileL; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    try { 
     Initialization(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

} 

private void Initialization() throws IOException { 
    // TODO Auto-generated method stub 
    setContentView(R.layout.main); 
    playSound = (Button) findViewById(R.id.myButton); 
    playSound.setOnClickListener(this); 
    RandomAudioPlayer = new MediaPlayer(); 
    Agetlist = this.getAssets(); 
      filelist = Agetlist.list(""); 

} 

public void onClick(View v) { 
    // TODO Auto-generated method stub 
    switch (v.getId()) { 
    case R.id.myButton: 
     OnClickMethod(); 
     break; 

    default: 
     break; 
    } 

} 

public class AudioRanActivity extends Activity implements OnClickListener { 
/** Called when the activity is first created. */ 
MediaPlayer RandomAudioPlayer; 
AssetFileDescriptor descriptor; 
Button playSound; 
String[] filelist; 
AssetManager Agetlist; 
String MediaFileL; 
int randomInt; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Initialization(); 

} 

private void Initialization() { 
    // TODO Auto-generated method stub 
    setContentView(R.layout.main); 
    playSound = (Button) findViewById(R.id.button1); 
    playSound.setOnClickListener(this); 
    RandomAudioPlayer = new MediaPlayer(); 
    Log.d("In Initialization Method", "Constructor For mp"); 

    Agetlist = this.getAssets(); 
    try { 
     filelist = Agetlist.list("audio"); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

} 

public void onClick(View v) { 
    // TODO Auto-generated method stub 
    switch (v.getId()) { 
    case R.id.button1: 
     OnClickMethod(); 
     break; 

    default: 
     break; 
    } 

} 

private void OnClickMethod() { 
    // TODO Auto-generated method stub 
    Random randomGenerator = new Random(); 
    randomInt = randomGenerator.nextInt(filelist.length); 
    Log.i("Length: ", String.valueOf(filelist.length)); 
    Log.i("RanInt: ", String.valueOf(randomInt)); 

    try { 
     MediaFileL = filelist[randomInt]; 
     Log.i("LengtD: ", MediaFileL); 

     descriptor = getAssets().openFd(MediaFileL); 
     RandomAudioPlayer.setDataSource(descriptor.getFileDescriptor(), 
       descriptor.getStartOffset(), descriptor.getLength()); 
     descriptor.close(); 
     RandomAudioPlayer.prepare(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } finally { 
     RandomAudioPlayer.start(); 
     Log.d("In OnClickMethod", "Start mp"); 
    } 
} 

}

崩潰日誌:

05-26 17:52:51.191: W/dalvikvm(1982): threadid=1: thread exiting with uncaught exception (group=0x409c01f8) 
05-26 17:52:51.282: E/AndroidRuntime(1982): FATAL EXCEPTION: main 
05-26 17:52:51.282: E/AndroidRuntime(1982): java.lang.NullPointerException 
05-26 17:52:51.282: E/AndroidRuntime(1982):  at sound.stuff.RandomSoundFormAssetsFolder.OnClickMethod(RandomSoundFormAssetsFolder.java:68) 
05-26 17:52:51.282: E/AndroidRuntime(1982):  at sound.stuff.RandomSoundFormAssetsFolder.onClick(RandomSoundFormAssetsFolder.java:51) 
05-26 17:52:51.282: E/AndroidRuntime(1982):  at android.view.View.performClick(View.java:3511) 
05-26 17:52:51.282: E/AndroidRuntime(1982):  at android.view.View$PerformClick.run(View.java:14105) 
05-26 17:52:51.282: E/AndroidRuntime(1982):  at android.os.Handler.handleCallback(Handler.java:605) 
05-26 17:52:51.282: E/AndroidRuntime(1982):  at android.os.Handler.dispatchMessage(Handler.java:92) 
05-26 17:52:51.282: E/AndroidRuntime(1982):  at android.os.Looper.loop(Looper.java:137) 
05-26 17:52:51.282: E/AndroidRuntime(1982):  at android.app.ActivityThread.main(ActivityThread.java:4424) 
05-26 17:52:51.282: E/AndroidRuntime(1982):  at java.lang.reflect.Method.invokeNative(Native Method) 
05-26 17:52:51.282: E/AndroidRuntime(1982):  at java.lang.reflect.Method.invoke(Method.java:511) 
05-26 17:52:51.282: E/AndroidRuntime(1982):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
05-26 17:52:51.282: E/AndroidRuntime(1982):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
05-26 17:52:51.282: E/AndroidRuntime(1982):  at dalvik.system.NativeStart.main(Native Method) 

崩潰日誌:

05-27 11:50:48.378: W/System.err(2512): java.io.FileNotFoundException: sounds 
05-27 11:50:48.418: W/System.err(2512):  at android.content.res.AssetManager.openAssetFd(Native Method) 
05-27 11:50:48.418: W/System.err(2512):  at android.content.res.AssetManager.openFd(AssetManager.java:331) 
05-27 11:50:48.438: W/System.err(2512):  at sound.stuff.RandomSoundFormAssetsFolder.OnClickMethod(RandomSoundFormAssetsFolder.java:69) 
05-27 11:50:48.438: W/System.err(2512):  at sound.stuff.RandomSoundFormAssetsFolder.onClick(RandomSoundFormAssetsFolder.java:53) 
05-27 11:50:48.468: W/System.err(2512):  at android.view.View.performClick(View.java:3511) 
05-27 11:50:48.468: W/System.err(2512):  at android.view.View.onKeyUp(View.java:6073) 
05-27 11:50:48.468: W/System.err(2512):  at android.widget.TextView.onKeyUp(TextView.java:5532) 
05-27 11:50:48.488: W/System.err(2512):  at android.view.KeyEvent.dispatch(KeyEvent.java:2575) 
05-27 11:50:48.488: W/System.err(2512):  at android.view.View.dispatchKeyEvent(View.java:5500) 
05-27 11:50:48.498: W/System.err(2512):  at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1246) 
05-27 11:50:48.498: W/System.err(2512):  at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1246) 
05-27 11:50:48.498: W/System.err(2512):  at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1246) 
05-27 11:50:48.508: W/System.err(2512):  at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1246) 
05-27 11:50:48.518: W/System.err(2512):  at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:1879) 
05-27 11:50:48.518: W/System.err(2512):  at com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1361) 
05-27 11:50:48.518: W/System.err(2512):  at android.app.Activity.dispatchKeyEvent(Activity.java:2324) 
05-27 11:50:48.530: W/System.err(2512):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1806) 
05-27 11:50:48.538: W/System.err(2512):  at android.view.ViewRootImpl.deliverKeyEventPostIme(ViewRootImpl.java:3327) 
05-27 11:50:48.538: W/System.err(2512):  at android.view.ViewRootImpl.handleFinishedEvent(ViewRootImpl.java:3300) 
05-27 11:50:48.558: W/System.err(2512):  at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2460) 
05-27 11:50:48.558: W/System.err(2512):  at android.os.Handler.dispatchMessage(Handler.java:99) 
05-27 11:50:48.568: W/System.err(2512):  at android.os.Looper.loop(Looper.java:137) 
05-27 11:50:48.568: W/System.err(2512):  at android.app.ActivityThread.main(ActivityThread.java:4424) 
05-27 11:50:48.578: W/System.err(2512):  at java.lang.reflect.Method.invokeNative(Native Method) 
05-27 11:50:48.578: W/System.err(2512):  at java.lang.reflect.Method.invoke(Method.java:511) 
05-27 11:50:48.588: W/System.err(2512):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
05-27 11:50:48.600: W/System.err(2512):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
05-27 11:50:48.608: W/System.err(2512):  at dalvik.system.NativeStart.main(Native Method) 
05-27 11:50:48.608: E/MediaPlayer(2512): start called in state 1 
05-27 11:50:48.608: E/MediaPlayer(2512): error (-38, 0) 
05-27 11:50:48.648: E/MediaPlayer(2512): Error (-38,0) 

我一直在努力嘗試調試此。我正在修改我的代碼並放入一些Log-Method。字符串數組正在工作我得到長度一致14,我得到隨機位置。所以這一切都工作。她是日誌'FileNotFoundException'中的問題,所以文件沒有加載,但是當我記錄MediaFileL時,我得到一個音頻文件名。我使用MediaPlayer錯誤或AssetFileDescriptor?這裏是使用LogCat的代碼。

public class AudioRanActivity extends Activity implements OnClickListener { 
/** Called when the activity is first created. */ 
MediaPlayer RandomAudioPlayer; 
AssetFileDescriptor descriptor; 
Button playSound; 
String[] filelist; 
AssetManager Agetlist; 
String MediaFileL; 
int randomInt; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    Initialization(); 

} 

private void Initialization() { 
    // TODO Auto-generated method stub 
    setContentView(R.layout.main); 
    playSound = (Button) findViewById(R.id.button1); 
    playSound.setOnClickListener(this); 

    RandomAudioPlayer = new MediaPlayer(); 
    Log.d("In Initialization method", "RandomAudioPlayer"); 

    Agetlist = this.getAssets(); 
    Log.d("TAGAgetlist", "Agetlist"); 
    try { 
     filelist = Agetlist.list("audio"); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

} 

public void onClick(View v) { 
    // TODO Auto-generated method stub 
    switch (v.getId()) { 
    case R.id.button1: 
     OnClickMethod(); 
     break; 

    default: 
     break; 
    } 

} 

private void OnClickMethod() { 
    // TODO Auto-generated method stub 
    Random randomGenerator = new Random(); 
    randomInt = randomGenerator.nextInt(filelist.length); 
    Log.i("Lengt: ", String.valueOf(filelist.length)); 
    Log.i("RanInt: ", String.valueOf(randomInt)); 

    try { 
     MediaFileL = filelist[randomInt]; 
     Log.i("LengtD: ", MediaFileL); 

     descriptor = getAssets().openFd(MediaFileL); 
     RandomAudioPlayer.setDataSource(descriptor.getFileDescriptor(), 
       descriptor.getStartOffset(), descriptor.getLength()); 
     descriptor.close(); 
     RandomAudioPlayer.prepare(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } finally { 
     RandomAudioPlayer.start(); 
     Log.d("RanPlaystart", "RandomAudio"); 
    } 
    Initialization(); 
} 

}

登錄:

05-28 10:12:31.175: D/In Initialization Method(792): Constructor For mp 
05-28 10:13:07.606: I/Lengt:(792): 14 
05-28 10:13:07.606: I/RanInt:(792): 3 
05-28 10:13:07.634: I/LengtD:(792): good_job.mp3 
05-28 10:13:07.655: W/System.err(792): java.io.FileNotFoundException: good_job.mp3 
05-28 10:13:07.664: W/System.err(792): at android.content.res.AssetManager.openAssetFd(Native Method) 
05-28 10:13:07.664: W/System.err(792): at android.content.res.AssetManager.openFd(AssetManager.java:331) 
05-28 10:13:07.675: W/System.err(792): at Audio.stuff.AudioRanActivity.OnClickMethod(AudioRanActivity.java:75) 
05-28 10:13:07.675: W/System.err(792): at Audio.stuff.AudioRanActivity.onClick(AudioRanActivity.java:55) 
05-28 10:13:07.684: W/System.err(792): at android.view.View.performClick(View.java:3511) 
05-28 10:13:07.684: W/System.err(792): at android.view.View$PerformClick.run(View.java:14105) 
05-28 10:13:07.684: W/System.err(792): at android.os.Handler.handleCallback(Handler.java:605) 
05-28 10:13:07.695: W/System.err(792): at android.os.Handler.dispatchMessage(Handler.java:92) 
05-28 10:13:07.704: W/System.err(792): at android.os.Looper.loop(Looper.java:137) 
05-28 10:13:07.716: W/System.err(792): at android.app.ActivityThread.main(ActivityThread.java:4424) 
05-28 10:13:07.716: W/System.err(792): at java.lang.reflect.Method.invokeNative(Native Method) 
05-28 10:13:07.716: W/System.err(792): at java.lang.reflect.Method.invoke(Method.java:511) 
05-28 10:13:07.724: W/System.err(792): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
05-28 10:13:07.724: W/System.err(792): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
05-28 10:13:07.734: W/System.err(792): at dalvik.system.NativeStart.main(Native Method) 
05-28 10:13:07.734: E/MediaPlayer(792): start called in state 1 
05-28 10:13:07.734: E/MediaPlayer(792): error (-38, 0) 
05-28 10:13:07.745: D/In OnClickMethod(792): Start mp 
05-28 10:13:07.754: E/MediaPlayer(792): Error (-38,0) 

回答

0

使用

RandomAudioPlayer = new MediaPlayer(); 
Agetlist = this.getAssets(); 
filelist = Agetlist.list(""); 

,因爲你的String []文件清單;因此首先從資產中獲取文件列表中的所有文件列表,然後在OnClickMethod()中使用。

+0

非常感謝您的回覆。我試過這個。現在我得到java.io.FileNotFoundException:聲音在我的問題中有我的日誌聊天。 – Gudrodur

+0

確定您的音頻文件直接位於資產文件夾或資產/音頻中的任何子文件夾中? –

+0

如果你有你的文件在子文件夾中,然後使用filelist = Agetlist.list(「SUBFOLDER_NAME」);而不是filelist = Agetlist.list(「」); –

0

對於那些可能有所幫助。它是這樣工作的。我需要,它添加我的子文件夾弦 「音頻/」 + RandomAudio

這裏是我的錯誤:

descriptor = getAssets().openFd("audio/" + MediaFileL); 



public class AudioRanActivity extends Activity implements OnClickListener { 
MediaPlayer RandomAudioPlayer; 
AssetFileDescriptor descriptor; 
Button playSound; 
String[] filelist; 
AssetManager Agetlist; 
String MediaFileL; 
int randomInt; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Initialization(); 

} 

private void Initialization() { 
    setContentView(R.layout.main); 
    // Geting audio-files 
    Agetlist = this.getAssets(); 
    try { 
     // Constructs string-arry from assets/audio folder 
     filelist = Agetlist.list("audio"); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    playSound = (Button) findViewById(R.id.button1); 
    playSound.setOnClickListener(this); 

    // MediaPlayer Constructor 
    RandomAudioPlayer = new MediaPlayer(); 
    Log.d("In OnClickMethod Method TagLog", "Constructor For mp"); 

} 

public void onClick(View v) { 
    switch (v.getId()) { 
    case R.id.button1: 
     OnClickMethod(); 
     break; 

    default: 
     break; 
    } 

} 

private void OnClickMethod() { 
    // Random-factory 
    Random randomGenerator = new Random(); 

    // Gets int file-list length 
    randomInt = randomGenerator.nextInt(filelist.length); 
    Log.i("Length Log: ", String.valueOf(filelist.length)); 
    Log.i("RanInt Log: ", String.valueOf(randomInt)); 
    try { 

     // One Audio-file putIn string 
     // InputRaw = openFileInput(name) 
     MediaFileL = filelist[randomInt]; 
     Log.i("What file is it? Log: ", MediaFileL); 

     // AssetFileDescriptor open audio-file 
     descriptor = getAssets().openFd("audio/" + MediaFileL); 
     /* 
     * Parameters fd: the FileDescriptor for the file you want to play 
     * offset: the offset into the file where the data to be played 
     * starts, in bytes length: the length in bytes of the data to be 
     * played 
     */ 
     RandomAudioPlayer.setDataSource(descriptor.getFileDescriptor(), 
       descriptor.getStartOffset(), descriptor.getLength()); 
     descriptor.close(); 
     RandomAudioPlayer.prepare(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    RandomAudioPlayer.start(); 
    Log.d("In OnClickMethod TagLog", "Start mp"); 
} 

}

1

這是一個明確的和通用的方法:

private static String getRandomMediaFilePath(Context context, String assetSpecificFolderPath) 
{ 
    AssetManager assetManager; 
    String[] fileList; 
    String mediaFileName; 
    String mediaFilePath; 

    try 
    { 
     assetManager = context.getAssets(); 
     fileList = assetManager.list(assetSpecificFolderPath); 
     mediaFileName = fileList[getRandomNumber(0,fileList.length - 1)]; 
     mediaFilePath = assetSpecificFolderPath + "/" + mediaFileName; 
    } 
    catch (IOException e) 
    { 
     e.printStackTrace(); 
    } 

    return mediaFilePath; 
} 


private static int getRandomNumber(int min, int max) 
{ 
    // Usually this should be a field rather than a method variable so 
    // that it is not re-seeded every call. 
    Random random = new Random(); 

    // nextInt is normally exclusive of the top value, 
    // so add 1 to make it inclusive 
    int randomNum = random.nextInt((max - min) + 1) + min; 

    return randomNum; 
} 

用法:

getRandomMediaFilePath(context, "MediaResources/Sounds") 

雖然資產文件夾包含文件夾「MediaResources/Sounds」