2017-06-29 5 views
0

Ich machte eine Android-App, die Stimme von lokalen Wifi-Netzwerk streamt. Um zu hören und zu streamen benutze ich die Opus C API in JNI um zu dekodieren und OpenSL Audio zu lesen.OpenSL Audio auf Android stoppen, wenn ich Bildschirm sperren 5.0.1 OK 6.0.1 Nicht OK

Ich rufe den JNI von Service, so.

public class StreamService extends Service { 

     private NativeReceiver mNativeReceiver; 
... 

@Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     // Gérer la requête 
     mNativeReceiver = new NativeReceiver(); 
     mCanPlay = mNativeReceiver.init(); 
      mNativeReceiver.startNativeReceiver(); 
    ...   
    return Service.START_NOT_STICKY; 
} 

Es ist sehr gut funktioniert, wenn ich auf meinem Knopf klicken, wird dieser Dienst genannt, und ich bekomme von meinem Android-Smartphone sondieren.

ABER, wenn ich den Bildschirm meines Smartphones sperren, ist Sound wie "stummgeschaltet", wenn ich entsperren Sound spielt. Nur auf 6.0.X nicht auf 5.0.X

Also mein erstes Denken war Netzwerkpaket wurde gestoppt, machte ich ein Debug und mein Smartphone weiterhin Netzwerkpakete zu erhalten.

Mein Dienst läuft, nur der Ton ist stummgeschaltet.

Für die JNI OpenSL, verwende ich diesen Code-Snippet:

diese
public void startNativeReceiver() { 
    new Thread(new Runnable() { 
     @Override 
     public void run() { 
       // set priority 
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO); 
       start(); 
      } 
     }).start(); 
    } 

Und das nennt:

const int queue_elements_num = 20; 
    const int start_after = 4; 
    SpscCircularQueue *queue = NULL; 

    OpusDecoder *opus_dec = NULL; 
    uint32_t samplerate = 24000; 
    float frame_length = 20; 

    bool player_initialized = false; 
    bool player_started = false; 
    int frames_in_queue = 0; 

    while (!rcv_th_terminate) { 
     ssize_t rcv_len = read(udp_sock, rcv_buf, sizeof(rcv_buf)); 
     if (rcv_len <= 0) { 
      __android_log_print(ANDROID_LOG_WARN, "SMPlayer", 
          "Failed to receive UDP data"); 
      continue; 
     } 
     __android_log_print(ANDROID_LOG_INFO, "SMPlayer", 
          "reading"); 
     if (!player_initialized) { 
      if (rcv_buf[0] != 0x01) { 
       __android_log_print(ANDROID_LOG_ERROR, "SMPlayer", 
            "Unsupported version of SMPlayer " 
            "streaming protocol"); 
       return NULL; 
      } 
      /* initialize decoder */ 
      int opus_err = 0; 
      opus_dec = opus_decoder_create(samplerate, 1, &opus_err); 
      if (!opus_dec) { 
       __android_log_print(ANDROID_LOG_ERROR, "SMPlayer", 
            "unable to initialize OPUS decoder, " 
            "error code - %d", opus_err); 
       return NULL; 
      } 

      /* initialize circular queue */ 
      uint32_t frame_buf_size = samplerate/1000 * frame_length * 2; 
      queue = spsc_circular_queue_alloc(queue_elements_num, frame_buf_size); 
      if (!queue) { 
       __android_log_print(ANDROID_LOG_ERROR, "SMPlayer", 
            "unable to allocate SPSC Circular Queue"); 
       opus_decoder_destroy(opus_dec); 
       return NULL; 
      } 

      /* initialize the play and start the playback */ 
      osl_player_init(queue, samplerate); 
      player_initialized = true; 
     } else { 
      int dec_samples = opus_decode(opus_dec, rcv_buf + 2, rcv_len - 2, 
             (int16_t *)dec_buf, sizeof(dec_buf), 0); 
      if (dec_samples <= 0) { 
       __android_log_print(ANDROID_LOG_ERROR, "SMPlayer", 
            "failed to decode the data"); 
       osl_player_terminate(); 
       spsc_circular_queue_free(queue); 
       opus_decoder_destroy(opus_dec); 
       exit(EXIT_FAILURE); 
      } 

      while (!spsc_circular_queue_push(queue, dec_buf) && !rcv_th_terminate) 
       usleep((useconds_t)(frame_length * 1000.0)); 

      if (!player_started) { 
       frames_in_queue++; 

       if (frames_in_queue == start_after) { 
        osl_player_jumpstart(queue); 
        player_started = true; 
       } 
      } 
     } 
    } 

    osl_player_terminate(); 

    if (empty_buf_cnt) 
     __android_log_print(ANDROID_LOG_DEBUG, "SMPlayer", 
          "Empty buffers played: %" PRIu64, empty_buf_cnt); 

    spsc_circular_queue_free(queue); 
    opus_decoder_destroy(opus_dec); 
} 

Irgendwelche Ideen

meinen JNI zu nennen? Vielen Dank !!

EDIT: Auf Android 5.0.1 funktioniert es, auf Android 6.0.1 es nicht?! Warum ??

EDIT2: Meine Berechtigungen

<uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <uses-permission android:name="android.permission.WAKE_LOCK" /> 
    <uses-permission android:name="android.permission.RECORD_AUDIO" /> 
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> 

    <application 
     android:allowBackup="true" 

EDIT 3: Ich zeichne nicht, ich höre nur

EDIT 4: Nach dem Put-Berechtigungen, Audio aufnehmen, keine Änderungen, auf Android-Eibisch (Samsung S5) Wenn ich den Bildschirm sperre, ist meine App wie gedämpft!

+0

sieh dir das an, um nach deinen Berechtigungen zu suchen und füge die benötigten hinzu. https://developer.android.com/training/permissions/requesting.html –

+0

RECORD_AUDIO ist eine gefährliche Erlaubnis ... Sie müssen es zur Laufzeit hinzufügen, um in Marshmallow zu beheben –

+0

Ich füge es zu versuchen, aber ich glaube nicht Ich brauche diese Erlaubnis, weil ich nicht aufzeichnen, sondern nur durch Wifi-Netzwerk zuhören, aber ich werde es schnell versuchen;) – maathor

Antwort

0

Ich denke, Ihre Erlaubnis verfällt in 6.0 und höheren Android-Versionen, also überprüfen Sie Ihre Berechtigungen, wenn Ihre Erlaubnis in Dangerous-Berechtigung ist, dann geben Sie es dynamisch.

+1

Ich verstehe nicht die Erlaubnis, die Sie behandeln? In meinem Manifest? – maathor

Verwandte Themen