Autore Topic: Widget collegato a service  (Letto 755 volte)

Offline bruciato

  • Nuovo arrivato
  • *
  • Post: 3
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus s
  • Sistema operativo:
    windows 7
Widget collegato a service
« il: 25 Gennaio 2012, 11:06:23 CET »
0
salve, siccome sto uscendo matto mi potreste dire cosa secondo voi non va bene nel codice? Il suddetto widget in pratica non fa nient altro che far partire un recoder alla pressione dello start e stopparlo alla pressione dello stop e far partire il programma principale. Ora il problema principale è che appena clicco su start si blocca e mi da:

 java.lang.RuntimeException: start failed.
 android.media.MediaRecorder.start(Native Method)
...

A volte mi parte a volte no, non capisco assolutamente il motivo...

Allego i codici:

Questo è il codice del widget:
Codice: [Seleziona]
package it.ioprogrammo.andrea;


import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;
import android.widget.RemoteViews;


public class AudioRecorderWidgetActivity extends AppWidgetProvider {
       


       
        public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
       
                   
            RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.mainw); // Get the layout for the App Widget

           
            final Intent registerIntent = createIntent(context, appWidgetIds);
            registerIntent.putExtra(StartRecording.REGISTERING, true);
            registerIntent.setAction(StartRecording.START_REC);
            PendingIntent pendingRegisterIntent = PendingIntent.getService(context, 0, registerIntent, 0);
           
         
            final Intent stopIntent = createIntent(context, appWidgetIds);
            stopIntent.putExtra(StartRecording.REGISTERING, false);
            stopIntent.setAction(StartRecording.STOP_REC);
            PendingIntent pendingStopIntent = PendingIntent.getService(context, 0, stopIntent, 0);
           
 
           
         // bind click events to the pending intents
            views.setOnClickPendingIntent(R.id.txtOff, pendingStopIntent);
            views.setOnClickPendingIntent(R.id.txtOn, pendingRegisterIntent);
   
           
           
   
            // Tell the AppWidgetManager to perform an update on the current app widget
            appWidgetManager.updateAppWidget(appWidgetIds, views);

        }
   
private Intent createIntent(Context context, int[] appWidgetIds) {
         Intent updateIntent = new Intent(context.getApplicationContext(),
         StartRecording.class);
         updateIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,
         appWidgetIds);
         return updateIntent;
         }
         
       
}



questo il codice del Service:
Codice: [Seleziona]
package it.ioprogrammo.andrea;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import android.app.Service;
import android.appwidget.AppWidgetManager;
import android.content.Intent;
import android.media.MediaRecorder;
import android.os.IBinder;
import android.widget.ListView;
import android.widget.RemoteViews;
import android.widget.Toast;
 
public class StartRecording extends Service {
 public static final String REGISTERING = "sta registrando";
 public static final String START_REC = "inizio registrazione";
 public static final String STOP_REC = "fine registrazione";
 public static final String ACTION_STATUS = "stato";
 
 private MediaRecorder recorder = null;
 
 
 ListView listView;
 private static String CURRENT_FOLDER = "/sdcard/Music/";
 SimpleDateFormat formatter = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss");
 Date now = new Date();
 
 @Override
 public void onStart(Intent intent, int startId) {
 AppWidgetManager widgetManager = AppWidgetManager.getInstance(this.getApplicationContext());
 
 // fetch widgets to be updated
 int[] widgetIds = intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS);
 if (widgetIds.length > 0) {
 // fetching timeout, setting status
 for (int widgetId : widgetIds) {
 RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.mainw);

 if (intent.getBooleanExtra(REGISTERING, false)) {
         
         startRecording();
         Toast.makeText(StartRecording.this,"Inizio registrazione", Toast.LENGTH_LONG).show();
         
 } else {
         stopRecording();
         Toast.makeText(StartRecording.this,"Stop registrazione", Toast.LENGTH_LONG).show();
         
         Intent i=new Intent(getApplicationContext(),AudioRecorderActivity.class);
         i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         startActivity(i);
 
         
 }
 
 widgetManager.updateAppWidget(widgetId, remoteViews);
 }

 }
 
 }
 
 private void stopRecording(){
     
             recorder.stop();
             recorder.reset();
             recorder.release();
             
             recorder = null;
     
}
 
 private void startRecording(){
         
         
     
     recorder = new MediaRecorder();
     
     
     
     
     recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
     recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
     recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
     recorder.setOutputFile(getFilename());
     
     recorder.setOnErrorListener(errorListener);
     recorder.setOnInfoListener(infoListener);
     
     try {
                    
             recorder.prepare();
             recorder.start();
     } catch (IllegalStateException e) {
             e.printStackTrace();
     } catch (IOException e) {
             e.printStackTrace();
     }
}
 
 @Override
 public IBinder onBind(Intent intent) {
 return null;
 }
 
 private String getFilename(){
     //String filepath = Environment.getExternalStorageDirectory().getPath();
     File file = new File(CURRENT_FOLDER);
     
     if(!file.exists()){
             file.mkdirs();
     }
     
     return (file.getPath()+ "/" + formatter.format(now) + ".mp4");
 }
 
 private MediaRecorder.OnErrorListener errorListener = new MediaRecorder.OnErrorListener() {
     public void onError(MediaRecorder mr, int what, int extra) {
             AppLog.logString("Error: " + what + ", " + extra);
     }
};

private MediaRecorder.OnInfoListener infoListener = new MediaRecorder.OnInfoListener() {
     public void onInfo(MediaRecorder mr, int what, int extra) {
             AppLog.logString("Warning: " + what + ", " + extra);
     }
};
 

}
« Ultima modifica: 25 Gennaio 2012, 12:32:35 CET da bruciato »

Offline bruciato

  • Nuovo arrivato
  • *
  • Post: 3
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus s
  • Sistema operativo:
    windows 7
Re:Widget collegato a service
« Risposta #1 il: 25 Gennaio 2012, 12:49:11 CET »
0
a me dà l'idea che è come se al click partisse + volte il recorder, visto che mi crea 2 file ma sono corrotti e non si aprono...

Offline bruciato

  • Nuovo arrivato
  • *
  • Post: 3
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus s
  • Sistema operativo:
    windows 7
Re:Widget collegato a service
« Risposta #2 il: 25 Gennaio 2012, 13:22:59 CET »
0
sembra che sia riuscito a risolvere in questo modo, ora funzia..

Codice: [Seleziona]
package it.ioprogrammo.andrea;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import android.app.Service;
import android.appwidget.AppWidgetManager;
import android.content.Intent;
import android.media.MediaRecorder;
import android.os.IBinder;
import android.widget.ListView;
import android.widget.RemoteViews;
import android.widget.Toast;
 
public class StartRecording extends Service {
 public static final String REGISTERING = "sta registrando";
 public static final String START_REC = "inizio registrazione";
 public static final String STOP_REC = "fine registrazione";
 public static final String ACTION_STATUS = "stato";
 
 private MediaRecorder recorder = null;
 
 
 ListView listView;
 private static String CURRENT_FOLDER = "/sdcard/Music/";
 SimpleDateFormat formatter = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss");
 Date now = new Date();
 
 @Override
 public void onStart(Intent intent, int startId) {
 AppWidgetManager widgetManager = AppWidgetManager.getInstance(this.getApplicationContext());
 

 RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.mainw);

 if (intent.getBooleanExtra(REGISTERING, false)) {

         
         startRecording();
         Toast.makeText(StartRecording.this,"Inizio registrazione", Toast.LENGTH_LONG).show();
         
 } else {
         stopRecording();
         Toast.makeText(StartRecording.this,"Stop registrazione", Toast.LENGTH_LONG).show();
         
         Intent i=new Intent(getApplicationContext(),AudioRecorderActivity.class);
         i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         startActivity(i);
         
         stopSelf();
 
         
 }
 widgetManager.updateAppWidget(startId, remoteViews);
 
 

 }