Динамическое сохранение функций на SD-карте и в контекстном меню или по нажатию кнопки - PullRequest
1 голос
/ 22 января 2011

Относительно приведенного ниже кода, как я могу сделать

if (savering(R.raw.sound1)){

и

String filename=”sound1″+”.ogg”;

и

values.put(MediaStore.MediaColumns.TITLE, “sound1″);

динамический вместо статического, так что звуковой файл, который будет сохранен, основан на нажатой кнопке?

Мои звуковые файлы находятся в массиве soundArray, сохраненном как sound1, sound2, sound3 и т. Д. Для каждого звукового файла имеется кнопка. Нажмите, чтобы играть, длинный щелчок вызывает контекстное меню ниже.

Любая помощь или советы будут с благодарностью.

//CONTEXT MENU

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) {
     super.onCreateContextMenu(menu, v, menuInfo);
     menu.setHeaderTitle("Save as...");
     menu.add(0, v.getId(), 0, "Ringtone");
     menu.add(0, v.getId(), 0, "Notification");
    }
    @Override   
    public boolean onContextItemSelected(MenuItem item) { 
     if(item.getTitle()=="Ringtone"){function1(item.getItemId());}   
      else if(item.getTitle()=="Notification"){function2(item.getItemId());}  
      else {return false;}
     return true; 
    }

    public void function1(int id){  
     if 
     (savering(R.raw.sound1)){   
      // Code if successful   
      Toast.makeText(this, "Saved as Ringtone", Toast.LENGTH_SHORT).show(); 
     }           
     else           
     { 
      // Code if unsuccessful   
      Toast.makeText(this, "Failed - Check your SDCard", Toast.LENGTH_SHORT).show();
     }

    }
    public void function2(int id){   
     if 
     (savenot(R.raw.sound1)){   
      // Code if successful   
      Toast.makeText(this, "Saved as Notification", Toast.LENGTH_SHORT).show(); 
     }           
     else           
     { 
      // Code if unsuccessful   
      Toast.makeText(this, "Failed - Check your SDCard", Toast.LENGTH_SHORT).show(); 
     }
    }

//Save into Ring tone Folder

    public boolean savering(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="sound1"+".ogg"; 

     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, "sound1 Ringtone");   
     values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/ogg");   
     values.put(MediaStore.Audio.Media.ARTIST, "cssounds ");   
     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);    

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

     return true; 
    }

//Save in Notification Folder

    public boolean savenot(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/notifications/";
     String filename="sound1"+".ogg"; 

     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, "sound1 Notification");   
     values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/ogg");   
     values.put(MediaStore.Audio.Media.ARTIST, "cssounds ");   
     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);    

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

     return true; 
    }

1 Ответ

1 голос
/ 22 января 2011

хорошо, так что я думаю, что вы можете получить sol, используя следующие изменения:


1: возьмите два массива .one для хранения идентификаторов кнопок вызова, которые вы добавляете в меню для воспроизведения, и другой массив соответственно ссоответствующий идентификатор звукового массива для звука кнопок tht;


для exa`int btnid = new int [count]; // count - нет кнопок для воспроизведения кольца int rawid = ne int [count];

`than: вы можете поймать id кнопки, по которой щелкнули пункт меню, и из этого вы должны сравнить в function1 с вашим массивом btnid и получить индекс массива btnid, соответствующий

2: thanпосле того, как с тем же индексом вы можете найти rawsource в массиве rawid.


ur 1-ая проба теперь предназначена для второй пробы имени файла, вы просто попробуйте это:

String filename="sound"+id+".ogg";//id is index of array 
...