Autore Topic: problemi con MediaPlayer  (Letto 614 volte)

Offline rudj

  • Nuovo arrivato
  • *
  • Post: 18
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung s3 mini
  • Sistema operativo:
    mac os 10.75
problemi con MediaPlayer
« il: 13 Luglio 2013, 13:24:49 CEST »
0
non riesco a capire perchè questo codice :
Codice (Java): [Seleziona]
package com.rudylanzarini;

import android.media.MediaPlayer;
import android.os.Handler;
import android.widget.TextView;

public class Timer extends Thread {
    TextView tvTimer;
    TextView tvLevel;
    TextView tvBig;
    TextView tvSmall;
    MediaPlayer tribal=new MediaPlayer();
    private Chips chips;
    public Timer(TextView timer, TextView level, TextView big, TextView small) {
        this.tvTimer=timer;
        this.tvLevel=level;
        this.tvBig=big;
        this.tvSmall=small;
        tribal=MediaPlayer.create(pokerTimer,R.raw.tribal); //eccezione in questa riga

    }
    PokerTimer pokerTimer=new PokerTimer();

    final static int INITSECONDS=3;
    final static int INITMINUTE=0;
    private int INITUNFORMATTEDSECONDS = INITMINUTE*60+INITSECONDS;

    Handler handler=new Handler();
    private int unformattedSeconds=INITUNFORMATTEDSECONDS;
    private int formattedSeconds;
    private int minute=INITMINUTE;

    public void reset(){
        unformattedSeconds=INITUNFORMATTEDSECONDS;
        displayTimer();
    }

    public void run(){
        while (true)
        {
            try {
                Thread.sleep(1000);

            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if (PokerTimer.isRunning) {
                handler.post(new Runnable() {
                    @Override
                    public void run() {

                        if (!tvTimer.getText().equals("MAX")) unformattedSeconds--;

                        displayTimer();

                        if (unformattedSeconds<=0) {

                            if (PokerTimer.currentLevel==Livelli.totLevel) {     //fine livelli
                                tvTimer.setText("MAX");
                            }else{

                                unformattedSeconds=INITUNFORMATTEDSECONDS;   //reset timer

                                //cambia livello di bui
                                pokerTimer.setCurrentLevel(pokerTimer.getCurrentLevel()+1);
                                pokerTimer.setLevel(PokerTimer.currentLevel,tvLevel,tvBig,tvSmall);
                                tribal.start();
                            }
                        }


                    }
                });
            }
        }

    }

    private void displayTimer() {
        formattedSeconds=Math.abs((unformattedSeconds)%60);
        minute=unformattedSeconds/60;
        tvTimer.setText(String.valueOf(minute) + ":" + (formattedSeconds < 10 ? "0" + String.valueOf(formattedSeconds) : String.valueOf(formattedSeconds)));
    }

}
crea questa eccezione:

07-13 13:14:02.181: ERROR/AndroidRuntime(10138): FATAL EXCEPTION: main
        java.lang.RuntimeException: Unable to start activity ComponentInfo{com.rudylanzarini/com.rudylanzarini.PokerTimer}: java.lang.NullPointerException
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2081)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2106)
        at android.app.ActivityThread.access$700(ActivityThread.java:134)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1217)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:4856)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774)
        at dalvik.system.NativeStart.main(Native Method)
        Caused by: java.lang.NullPointerException
        at android.content.ContextWrapper.getResources(ContextWrapper.java:81)
        at android.media.MediaPlayer.create(MediaPlayer.java:844)
        at com.rudylanzarini.Timer.<init>(Timer.java:19)
        at com.rudylanzarini.PokerTimer.initVars(PokerTimer.java:98)
        at com.rudylanzarini.PokerTimer.onCreate(PokerTimer.java:36)
        at android.app.Activity.performCreate(Activity.java:5047)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2045)
        ... 11 more

praticamente sto cercando di costruire un timer per il gioco del poker, ma non riesco a far partire l'allarme di fine livello blind alla fine del tempo, se invece faccio partire il wav all'interno di onCreate nella classe principale PokerTimer parte senza problemi

Offline Sakazaki

  • Utente normale
  • ***
  • Post: 396
  • Respect: +74
    • Mostra profilo
  • Dispositivo Android:
    Sony xperia Z
  • Play Store ID:
    Saka Labs
  • Sistema operativo:
    Windows 8
Re:problemi con MediaPlayer
« Risposta #1 il: 15 Luglio 2013, 09:21:02 CEST »
0
Dipende dalla tua classe PokerTimer.

Il metodo create del MediaPlayer che stai usando al suo interno fa questo:

Codice (Java): [Seleziona]
public static MediaPlayer More ...create(Context context, int resid) {
  try {
    AssetFileDescriptor afd = context.getResources().openRawResourceFd(resid);
    if (afd == null) return null;
    //...

Come puoi vedere cerca di recuperare la risorsa (nel tuo caso R.raw.tribal) dal context che gli passi (nel tuo caso un'istanza di PokerTimer), ciò lascia pensare che il getResources() del tuo PokerTimer torna null.

Offline rudj

  • Nuovo arrivato
  • *
  • Post: 18
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung s3 mini
  • Sistema operativo:
    mac os 10.75
Re:problemi con MediaPlayer
« Risposta #2 il: 15 Luglio 2013, 20:14:17 CEST »
0
il ho passato un' istanza di pokertimer perchè ho visto che se nella classe Pokertimer inserivo Mediaplayer.create(this,R.raw.tribal) funzionava, this in questo caso non è la stessa cosa di un istanza pokerTimer?
Per comprendere meglio mi spiegate cos'è un Contex?  :D

Offline Sakazaki

  • Utente normale
  • ***
  • Post: 396
  • Respect: +74
    • Mostra profilo
  • Dispositivo Android:
    Sony xperia Z
  • Play Store ID:
    Saka Labs
  • Sistema operativo:
    Windows 8
Re:problemi con MediaPlayer
« Risposta #3 il: 15 Luglio 2013, 22:35:56 CEST »
0
Per comprendere meglio mi spiegate cos'è un Contex?  :D
Un Context (meglio: un implementazione della classe astratta Context) è, in generale, un oggetto che permette di accedere a risorse dell'applicazione e di eseguire chiamate al sistema operativo sottostante, per operazioni quali il lancio di activity o di di intent in broadcast.
Sostanzialmente fa queste due cose: recuperare risorse, lanciare intent.
L'oggetto Context che credo sia il più utilizzato in assoluto è Activity (che difatti recupera risorse ed è in grado a sua volta di lanciare altre activity via Intent).
Normalmente qualsiasi cosa necessiti di recuperare risorse ha bisogno di un context (se non lo è essa stessa) che faccia da "ponte" con il sistema sottostante.

il ho passato un' istanza di pokertimer perchè ho visto che se nella classe Pokertimer inserivo Mediaplayer.create(this,R.raw.tribal) funzionava, this in questo caso non è la stessa cosa di un istanza pokerTimer?
Il che lascia pensare che o PokerTimer eredita ed implementa i metodi di un Context, e in linea di massima dovrebbe funzionare... difficile dirlo con certezza visto che non hai postato il codice del PokerTimer.