设置数组以在 Android 应用中保存声音

Posted

技术标签:

【中文标题】设置数组以在 Android 应用中保存声音【英文标题】:Setting up an array to save sounds in Android app 【发布时间】:2011-12-28 19:35:23 【问题描述】:

大家好,我已经四处寻找了一段时间,但无法找到我的问题的答案。我是 android 编程新手,在大学里学过一些但不多的 Java,但学过其他语言,所以我理解概念。我在问如何将我创建的数组实现到我的保存函数中。我以为我知道如何,但只是通过 saveasRing(0) 我的数组包含原始值但我收到强制关闭,所以这就是我问的原因。这是我的代码。

我不是在要求某人编写我的代码,而是向我解释要做什么......我想学习,希望我只是忽略了一些东西,但如果没有,请引导我朝着正确的方向前进。 谢谢!

String[] name = "a1", "a", "b","c"; //code shortened
int[] sounds = R.raw.a1, R.raw.a ;  //code shortened for ease of reading

public void function1(int id)  // when I change int to int[] Eclipse wants me 
                                // to change alot of things and then the app will 
                                // force close on start
  saveasRing(sounds);           // right here I have tried passing "0" instead 
                                // of sounds, a no go.

  Toast.makeText(this, "Saved as Ringtone", Toast.LENGTH_SHORT).show();  
//Closes Function 1  

//Save as Ringtone Coding for Function 3  
public boolean saveasRing(int ressound)  
  byte[] buffer=null;  
  InputStream fIn = getBaseContext().getResources().openRawResource(ressound);  
  int size=0;  

  try   
    size = fIn.available();  
    buffer = new byte[size];  
    fIn.read(buffer);  
    fIn.close();  
   
  catch (IOException e)   
    // TODO Auto-generated catch block  
    return false;  
    

  String path="/sdcard/media/audio/ringtones/";  
  String filename= name +".mp3";  

  boolean exists = (new File(path)).exists();  
  if (!exists)new File(path).mkdirs();    

  FileOutputStream save;  
  try   
    save = new FileOutputStream(path+filename);  
    save.write(buffer);  
    save.flush();  
    save.close();  
   
  catch (FileNotFoundException e)   
    // TODO Auto-generated catch block  
    return false;  
   
  catch (IOException e)   
    // TODO Auto-generated catch block  
    return false;  
        

  sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,
                Uri.parse("file://"+path+filename)));  

  File k = new File(path, filename);  
  ContentValues values = new ContentValues();  
  values.put(MediaStore.MediaColumns.DATA, k.getAbsolutePath());  
  values.put(MediaStore.MediaColumns.TITLE, "dosequis");  
  values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mp3");  
  values.put(MediaStore.Audio.Media.ARTIST, "Most Interesting Man ");  
  values.put(MediaStore.Audio.Media.IS_RINGTONE, true);  
  values.put(MediaStore.Audio.Media.IS_NOTIFICATION, false);  
  values.put(MediaStore.Audio.Media.IS_ALARM, false);  
  values.put(MediaStore.Audio.Media.IS_MUSIC, false);  

  //Insert it into the database  
  this.getContentResolver().insert(MediaStore.Audio.Media.getContentUriForPath(k.getAbsolutePath()), values);  

  return true;  

//Closes Save as Ringtone 

这是我长按铃声时发生的事情的 Logcat。上下文菜单很好,就在我选择要保存的类型时,我强制关闭和这些错误。再次感谢您的光临。

如果有更好的格式化方法,请告诉我。

 W/ResourceType(225):No package identifier when getting name for resource number 0x00000000

D/AndroidRuntime(225):Shutting down VM

W/dalvikvm(225): threadid=3: thread exiting with uncaught exception (group=0x4001b188)

E/AndroidRuntime(225):Uncaught handler: thread main exiting due to uncaught exception

E/AndroidRuntime(225):android.content.res.Resources$NotFoundException: Resource ID #0x0

E/AndroidRuntime(225):at android.content.res.Resources.getValue(Resources.java:891)

E/AndroidRuntime(225):at Android.content.res.Resources.openRawResource(Resources.java:816)

E/AndroidRuntime(225):at android.content.res.Resources.openRawResource(Resources.java:798)

E/AndroidRuntime(225):at tomcavell.app.DosEquisSoundboardActivity.saveasRing(DosEquisSoundboardActivity.java:270)

E/AndroidRuntime(225):at tomcavell.app.DosEquisSoundboardActivity.function1(DosEquisSoundboardActivity.java:253)

E/AndroidRuntime(225):at tomcavell.app.DosEquisSoundboardActivity.onContextItemSelected(DosEquisSoundboardActivity.java:245)

E/AndroidRuntime(225):at android.app.Activity.onMenuItemSelected(Activity.java:2174)

E/AndroidRuntime(225):at com.android.internal.policy.impl.PhoneWindow$ContextMenuCallback.onMenuItemSelected(PhoneWindow.java:2731)

E/AndroidRuntime(225):at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:139)

E/AndroidRuntime(225):at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:855)

E/AndroidRuntime(225):at com.android.internal.view.menu.MenuDialogHelper.onClick(MenuDialogHelper.java:129)

E/AndroidRuntime(225):at com.android.internal.app.AlertController$AlertParams$3.onItemClick(AlertController.java:884)

E/AndroidRuntime(225):at android.widget.AdapterView.performItemClick(AdapterView.java:284)

E/AndroidRuntime(225):at android.widget.ListView.performItemClick(ListView.java:3285)

E/AndroidRuntime(225):at android.widget.AbsListView$PerformClick.run(AbsListView.java:1640)

E/AndroidRuntime(225):at android.os.Handler.handleCallback(Handler.java:587)

E/AndroidRuntime(225):at android.os.Handler.dispatchMessage(Handler.java:92)

E/AndroidRuntime(225):at android.os.Looper.loop(Looper.java:123)

E/AndroidRuntime(225):at android.app.ActivityThread.main(ActivityThread.java:4363)

E/AndroidRuntime(225):at java.lang.reflect.Method.invokeNative(Native Method)

E/AndroidRuntime(225):at java.lang.reflect.Method.invoke(Method.java:521)

E/AndroidRuntime(225):at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)

E/AndroidRuntime(225):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)

E/AndroidRuntime(225):at dalvik.system.NativeStart.main(Native Method)

I/dalvikvm(225): threadid=7: reacting to signal 3

I/dalvikvm(225): Wrote stack trace to '/data/anr/traces.txt'

【问题讨论】:

您将需要包含您在 logcat 下遇到的任何异常,以便我们真正了解问题所在。我看到了一些关于读写 IO 流的问题,这些问题可能会导致其他问题,但为什么它的强制关闭并不明显。 欢迎来到 ***。请花时间正确格式化您的代码,并使用空格而不是制表符来缩进。 (提示:您可以在您输入问题的区域下方实时预览帖子的格式。)正确格式化它可以让人们更容易阅读,提高您获得答案的机会,并让其他人不必为您编辑它。 :) 谢谢。 谢谢 Ken,就像我说的那样,我对 Java 和格式化它的方式有点陌生。现在我会让它看起来像现在一样!谢谢。 Chubbard 我现在就这么做,我认为这只是一个简单的数组问题。只有当我尝试通过将 0 传递给 saveasRing 函数 saveasRing(0) 来保存时,它才会强制关闭;否则应用程序运行正常。 【参考方案1】:

我想通了,我的问题。我必须使用 int 设置代码,然后将该 int 设置为

j=sounds[i]; //(assuming j was the int declared)

然后传递函数 saveasRing 和 i 一样在

saveasRing[i];

感谢您的关注和帮助!

【讨论】:

以上是关于设置数组以在 Android 应用中保存声音的主要内容,如果未能解决你的问题,请参考以下文章

Android比较两个声音以进行语音匹配

如何在 Android 应用中录制声音

Android录制我们自己的应用程序的声音

仅当我从设置中禁用通知时才收到通知声音

在 Windows 8 应用程序中转换字节数组以产生不同的音频声音

在方向更改上保存 TextView 的设置 - Android?