2013-08-29 20 views
2

有很多帮助(在这里)我设法几乎让我的应用程序运行起来,但我有一个问题。我基本上是Java的初学者,所以这对我来说有点深刻,但我仍然想要一些帮助。基本上,应用程序会显示一个音调列表,并让您播放它们,如果您触摸并按住它,则会弹出一个上下文菜单,并具有将所选音调复制到SD卡的选项。 我知道的问题在于倒数第四行:复制到SD的布尔问题,需要一些帮助来纠正

boolean saved = saveas(sound.getSoundResourceId(),"filename");
,因为未使用变量
saved
。 我不太清楚如何解决这个问题,或者我应该用什么来代替 saved,只是想知道这里的任何人是否有线索? 下面是完整的代码:

public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.activity_main); 
registerForContextMenu(getListView()); 
this.getListView().setSelector(R.drawable.selector); 
//create a simple list 
mSounds = new ArrayList<Sound>(); 
Sound s = new Sound(); 
s.setDescription("Affirmative"); 
s.setSoundResourceId(R.raw.affirmative); 
mSounds.add(s); 
s = new Sound(); 
s.setDescription("Anjels"); 
s.setSoundResourceId(R.raw.anjels); 
mSounds.add(s); 
s = new Sound(); 
s.setDescription("Aggro"); 
s.setSoundResourceId(R.raw.aggro); 
mSounds.add(s); 
mSounds.add(s); 
mAdapter = new SoundAdapter(this, R.layout.list_row, mSounds); 
setListAdapter(mAdapter); 
} 
@Override 
public void onListItemClick(ListView parent, View v, int position, long id){ 
Sound s = (Sound) mSounds.get(position); 
MediaPlayer mp = MediaPlayer.create(this, s.getSoundResourceId()); 
mp.start(); 

}@Override 
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { 
    super.onCreateContextMenu(menu, v, menuInfo); 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.context_menu, menu); 
    } 

public boolean saveas(int ressound, String fName){ 
    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="notifications/halon/"; 
    String filename=fName+".ogg"; 
    String baseDir = Environment.getExternalStorageDirectory().getAbsolutePath(); 
    String completePath = baseDir + File.separator + "music" + File.separator + "halon" + File.separator + filename; 


    boolean exists = (new File(completePath)).exists(); 
    if (!exists){new File(completePath).mkdirs();} 

    FileOutputStream save; 
    try { 
    save = new FileOutputStream(completePath); 
    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, "exampletitle"); 
    values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/ogg"); 
    values.put(MediaStore.Audio.Media.ARTIST, "cssounds "); 
    values.put(MediaStore.Audio.Media.IS_RINGTONE, false); 
    values.put(MediaStore.Audio.Media.IS_NOTIFICATION, true); 
    values.put(MediaStore.Audio.Media.IS_ALARM, true); 
    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; 
    } 
@Override 
public boolean onContextItemSelected(MenuItem item) { 
    AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); 
    Sound sound = (Sound) getListAdapter().getItem(info.position); 
    int length = mSounds.size(); // get the length of mSounds object 
    String[] names = new String[length]; // creates a fixed array with strings 
    for(int i = 0; i < length; i++) { 
     // add sound name to string array 
     names[i] = mSounds.get(i).getDescription(); // returns the string name 
    } 
    switch(item.getItemId()) { 
    case R.id.copytosd: 
      Toast.makeText(this, "Applying " + getResources().getString(R.string.copy) + 
         " for " + names[(int)info.id], 
         Toast.LENGTH_SHORT).show(); 
      boolean saved = saveas(sound.getSoundResourceId(),"filename"); 
      return true; 
    default: 
      return super.onContextItemSelected(item); 
    } 
}} 
+0

目前还不清楚你有什么样的问题 – Blackbelt

回答

0

如果你不打算使用saved,删除其中的语句boolean saved =,只是有saveas(sound.getSoundResourceId(),"filename");

+0

谢谢!这摆脱了错误,但仍然没有复制到SD卡。只是想知道我是否已经有了我的路径,因为我知道在源代码中硬编码路径并不好。你能看到其他问题或者我可能错过的任何东西吗? –

+0

@SeanBurrage:那么,你的'ACTION_MEDIA_SCANNER_SCAN_FILE'似乎是错误的。按住'new File(completePath)'(而不是多次创建它),然后使用'Uri.fromFile(completePath)'作为你的'Intent'。 – CommonsWare

+0

是否有机会发布代码的内联编辑?你似乎是唯一能帮助你的人。 –