我正在从我的应用中保存声音,以用作铃声或通知声音。以下是我的代码的一部分,取自this页面:
ContentValues values = new ContentValues();
values.put(MediaStore.MediaColumns.DATA, k.getAbsolutePath());
values.put(MediaStore.MediaColumns.TITLE, soundName);
values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/ogg");
values.put(MediaStore.Audio.Media.ARTIST, "artist");
values.put(MediaStore.Audio.Media.IS_RINGTONE, true);
values.put(MediaStore.Audio.Media.IS_NOTIFICATION, true);
values.put(MediaStore.Audio.Media.IS_ALARM, true);
values.put(MediaStore.Audio.Media.IS_MUSIC, false);
Uri uri = MediaStore.Audio.Media.getContentUriForPath(k.getAbsolutePath());
this.getContentResolver().insert(uri, values);
我的理解是声音将被保存,以及铃声,通知声音和闹钟,因为标志都设置为“true”。至少在模拟器上这确实有效,但在实际设备上,声音只出现在铃声列表中,我不明白为什么。
编辑:我试图进一步调查:删除“IS_RINGTONE”行不会改变任何东西(如果一次只能使用一个标志),声音不会显示在列表中通知声音。
感谢任何帮助。
亲切的问候,Select0r
答案 0 :(得分:4)
我玩弄了解这个问题的路径,这是我到目前为止提出的解决方案:
在模拟器上路径无关紧要,声音将出现在铃声和通知列表中。
在手机上,如果文件保存到/media/audio/ringtones
或/media/audio/
,声音将显示铃声列表但不作为通知。
如果我使用路径{{ 1}}声音最终出现在通知列表(!)中,但不再出现在铃声中。
所以我似乎必须保存声音两次才能将它放入两个列表中? (但为什么一旦在模拟器上工作就保存它?)
如果还有另一种方法可以将声音传入两个列表(甚至是三个列表,也有警报音,我只是不打扰它们),只保存一次,请告诉我。 (现在我的解决方法是一个对话框,让用户选择是将声音保存为铃声还是通知。)
答案 1 :(得分:1)
如果您尝试从MediaStore.Audio.Media更改为AudioColumns,它会有帮助吗?像这样:
values.put(AudioColumns.ARTIST, "artist");
values.put(AudioColumns.IS_RINGTONE, true);
values.put(AudioColumns.IS_NOTIFICATION, true);
values.put(AudioColumns.IS_ALARM, true);
values.put(AudioColumns.IS_MUSIC, false);
该引用并未说MediaStore.Audio.Media已被弃用,但我认为现在使用的是AudioColumns。我在我的应用程序中使用它似乎工作。
答案 2 :(得分:-2)
您必须查看Android中的媒体播放器API i.e.android.media.MediaPlayer; android.media.MediaPlayer.OnCompletionListener。这里是: http://developer.android.com/reference/android/media/package-summary .... 这就是你在点击听众时发出声音的方式:
private OnClickListener btnDontBeStupidListener = new
OnClickListener()
{
public void onClick(View v)
{
//Toast.makeText(getBaseContext(), "Don't Be Stupid audio file
is being played", Toast.LENGTH_SHORT).show();
final MediaPlayer mp = MediaPlayer.create(iMEvil.this,
R.raw.stupid);
//mp.start();
try {
mp.start();
//mp.release();
}catch(NullPointerException e){
Log.v("MP error", e.toString());
}
mp.setOnCompletionListener(new OnCompletionListener(){
// @Override
public void onCompletion(MediaPlayer arg0) {
mp.release();
}
});
}
};
另外,您是否尝试过播放时录制声音?试一试,看看它是否有效。