Parse en Uri till ljudfil i resources

Diskussion i 'Frågor, support och diskussion' startad av Danneman101, 16 okt 2011.

  1. Danneman101

    Danneman101 Kid Droid Medlem

    Blev medlem:
    18 aug 2009
    Inlägg:
    69
    Mottagna gillanden:
    0

    MINA ENHETER

    Jag använder en funktion för att spela upp mp3-filer.

    Problemet är att jag behöver spela upp massa filer dynamiskt.

    Denna kod funkar alltså för att spela upp "mySound.mp3":

    Kod:
    mPlayer = MediaPlayer.create(main.this, R.raw.mySound);
    mPlayer.start();
    
    Medan denna INTE funkar:

    Kod:
    String soundName = "mySound";
    Uri uri_soundName = Uri.parse("R.raw." + soundName);
    mPlayer = MediaPlayer.create(main.this, uri_soundName);
    mPlayer.start();
    
    mp3-filen ligger i res/raw.

    Har bl.a. även testat att parsa uri'n på följande manér:

    Kod:
    uri_soundName = Uri.parse("android.resource://com.myProject/myApp/raw/" + soundName);
    
    ...men till ingen nytta.

    Någon som vet vari felet ligger och hur jag löser det?
     
  2. ViLANDER

    ViLANDER Senior Droid Medlem

    Blev medlem:
    12 dec 2009
    Inlägg:
    1 594
    Mottagna gillanden:
    172

    MINA ENHETER

    Eftersom R-resurser bara är simpla int:s så kan du skapa en int-array för dina resurser.

    Exempelvis:

    Kod:
    int[] sounds = new int[] {
         R.raw.mySound00,
         R.raw.mySound01,
         R.raw.mySound02,
    };
    
    .....
    
    private void play(Context c, int[] soundArray, int soundId) {
         mPlayer = MediaPlayer.create(c, soundArray[soundId]);
         mPlayer.start();
    }
    
    .....
    
    play(this, sounds, 0);
    
    
    Vet inte riktigt hur du vill ha det eller mer ingående hur du tänkte, men jag skulle i alla fall göra på något liknande sätt.
     
  3. Danneman101

    Danneman101 Kid Droid Medlem

    Blev medlem:
    18 aug 2009
    Inlägg:
    69
    Mottagna gillanden:
    0

    MINA ENHETER

    Tack för svaret.

    Det fungerar faktiskt med din metod, men det hade blivit ett väldigt jobb att göra då jag har över tusen mp3-filer och alla är döpta på ett osystematiskt sätt (efter det ljud de spelar upp).

    Den enda typ av lösning som jag tror skulle fungera utan ett enormt merjobb är att ljud dynamiskt kan spelas upp efter namnet på dess fil. Kanske finns en annan lösning som ex. baseras på soundPool el dyl?

    Här är iaf min kod. Som du ser så anropas playWebViewSound-funktionen från en lokal html-sida och skickar parametern (dvs. namnet på ljudet som ska spelas) i form av en string.


    main.java
    Kod:
    package com.myProject;
    
    import android.app.Activity;
    import android.media.MediaPlayer;
    import android.net.Uri;
    import android.os.Bundle;
    import android.webkit.*;
    
    
    
    public class main extends Activity 
    {
        
        // -----------------------
        // DECL:	VARIABLES
        // -----------------------
    	private WebView webView;
    	
    	private MediaPlayer mPlayer;
    	Uri uri_soundName = null;
    
    	
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
                    
            // -----------------------
            // INIT:	WEBVIEW
            // -----------------------
            
            // Create webView
            webView = (WebView) findViewById(R.id.web_engine);  
            
            // Enable javascript
            webView.getSettings().setJavaScriptEnabled(true);
    
            // TODO: LOAD FIRST FILE
            // Load local url
            webView.loadUrl("file:///android_asset/html/intro.html");
            
            // Adds javascript interface (js can reach functions here)
            webView.addJavascriptInterface(new DemoJavaScriptInterface(), "Android");
       
        }
        
    
        // ------------------------------  
        // CLASS:	JAVASCRIPT HANDLER
        // ------------------------------
        // Descr: Called from intro.html
        final class DemoJavaScriptInterface 
        {
        	DemoJavaScriptInterface() {	}
    
            // FN:	PLAY SOUND
            public void playWebViewSound(String soundName) 
            {
                // TODO: PLAY AUDIO
            	uri_soundName = Uri.parse("R.raw." + soundName); 
            	mPlayer = MediaPlayer.create(main.this, uri_soundName);
            	mPlayer.start();
            }
        }
    }
    
    intro.html
    Kod:
    // in head
    	function EvalSound(soundobj) {		
    		Android.playWebViewSound(soundobj);		
    	}
    // in body
            img name="soundTag" src="myIcon.png" onClick="EvalSound('mySound')"
    
    Verkar som sidan inte vill visa formatterad html-kod, så jag tog bort det mesta inkl. < och > runt img-taggen.
     
    Last edited: 16 okt 2011
  4. ozp

    ozp Teen Droid Medlem

    Blev medlem:
    6 maj 2010
    Inlägg:
    250
    Mottagna gillanden:
    31

    MINA ENHETER

  5. Danneman101

    Danneman101 Kid Droid Medlem

    Blev medlem:
    18 aug 2009
    Inlägg:
    69
    Mottagna gillanden:
    0

    MINA ENHETER

    Det fungerade! :D

    Kod:
            public void playWebViewSound(String soundName) 
            {
            	Context context = main.this;
    
            	int n_soundName = context.getResources().getIdentifier(soundName, "raw", "com.myFirm");
            	
            	mPlayer = MediaPlayer.create(main.this, n_soundName);
            	
            	mPlayer.start();
            }
    
    Tackar så mycket för hjälpen - ni äger! :D


    [ EDIT ]

    Fast nu hänger sig istället programmet efter en sisådär 8 ljuduppspelningar. Antar att man måste flusha minnet från mediaplayern efter varje spelning. Ska googla runt lite efter en lösning och återkommer, men har ni något tips så mottages det gärna.
     
    Last edited: 16 okt 2011
  6. Danneman101

    Danneman101 Kid Droid Medlem

    Blev medlem:
    18 aug 2009
    Inlägg:
    69
    Mottagna gillanden:
    0

    MINA ENHETER

    Satte in den här koden längst upp i funktionen "playWebViewSound" och nu rensas mediaplayern ordentligt :)

    Kod:
    if(mPlayer!=null) {
     mPlayer.stop();
     mPlayer.release();
    }