2010-10-12 94 views
4

我正在保存从我的应用程序发出的声音以用作铃声或通知声音。下面是我的代码,从this页面参加:Android:保存声音作为铃声和通知

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); 

我的理解是,声音将被保存并作为铃声,通知声音和报警器,标志都设置为“真” 。至少在模拟器上这可以工作,但在实际的设备上,声音只出现在铃声列表中,我不知道为什么。

编辑:我试图进一步调查:删除与“IS_RINGTONE”行不会改变任何东西(如果一次只能使用一个标志),声音不会显示在列表中与通知声音。

任何帮助表示赞赏。

亲切的问候,Select0r

+0

有谁知道这是否可能在FLASH CS5.5上? 我在那里开发了一个音板,我真的非常需要将铃声添加到紧急事项中。 – 2011-10-17 20:04:34

回答

4

我与路径发挥各地得到这个解决,这里就是我想出了迄今为止的解决方案:

模拟器上的路径没关系,声音会出现在铃声以及通知列表中。

在电话上,如果文件保存到/media/audio/ringtones/media/audio/但不作为通知,声音将显示铃声列表。
如果我使用路径/media/audio/notifications,声音最终会出现在通知列表(!)中,但不会再出现在铃声中。

所以看来我必须保存声音两次才能进入这两个列表? (但是为什么在模拟器上保存一次呢?)

如果还有另外一种方法让声音进入这两个列表(甚至三个列表中,也有闹钟铃声,我只是没有打扰他们玩耍)只保存一次,请让我知道。 (现在我的解决方法是让用户选择是否将声音保存为铃声或通知的对话框。)

+0

我用我的音板也遇到了这个问题。据我所知,你必须多次保存它。我刚刚使用了一个AlertDialog,它提供了更改路径的保存位置的选项。但既然你想把它保存到两个列表中,我认为你必须保存两次。 – Snailer 2010-11-03 18:52:22

+0

经过测试和研究,我相信这实际上是要走的路,感谢您的确认。我想我会坚持使用我的解决方法,并询问用户保存文件的位置,而不是只保存声音两次(如您所述)。即使这不是我的意图,我想这是更好的可用性。 – Select0r 2010-11-03 20:51:24

-2

您必须查看Android 中的媒体播放器API(ieandroid.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(); 
         } 
       }); 
       } 
      }; 

而且,你尝试过录音的同时播放呢?尝试一下,看看它是否有效。

+0

我*不*试图播放声音而我*不*录制一个。还有*没有* ClickListener参与。你甚至读过这个问题吗? – Select0r 2010-11-02 09:26:19

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使用。我在我的应用程序中使用它,它似乎工作。

+0

好点,谢谢。我会尽力回复,如果有效的话。 – Select0r 2010-11-03 09:10:49

+0

我试图使用AudioColumns,但无法让它在我的设备上保存铃声或通知声音 - 所以MediaStore.Audio.Media似乎是要走的路。 – Select0r 2010-11-03 20:48:51