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:
diesepublic 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!
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 –
RECORD_AUDIO ist eine gefährliche Erlaubnis ... Sie müssen es zur Laufzeit hinzufügen, um in Marshmallow zu beheben –
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