android - No connection between devices? -
i've developed android application. voice chating
streaming audio between 2 android device works wifi on local network.
but when press start button nothing happends.it should ring , make connection
server code:
package com.example.voicechatserver; import android.support.v7.app.actionbaractivity; import android.os.bundle; import android.app.activity; import java.io.ioexception; import java.net.datagrampacket; import java.net.datagramsocket; import java.net.socketexception; import android.content.context; import android.media.audioformat; import android.media.audiomanager; import android.media.audiorecord; import android.media.audiotrack; import android.media.mediarecorder; import android.util.base64; import android.util.log; import android.view.view; import android.view.view.onclicklistener; import android.widget.button; import android.widget.edittext; import android.widget.textview; public class mainactivity extends activity { private button receivebutton,stopbutton; private textview recive; private edittext port; public static datagramsocket socket; private audiotrack speaker; private int port_num=4444; private int samplerate = 44100; private int channelconfig = audioformat.channel_out_mono; private int audioformat = audioformat.encoding_pcm_16bit; int minbufsize =audiorecord.getminbuffersize(samplerate, channelconfig, audioformat); byte[] buffer; //256 private boolean status = true; @override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); receivebutton = (button) findviewbyid (r.id.receive_button); stopbutton = (button) findviewbyid (r.id.stop_button); recive= (textview) findviewbyid(r.id.receive_label); //recive.settext("created...!"); receivebutton.setonclicklistener(receivelistener); stopbutton.setonclicklistener(stoplistener); //receivebutton.settext("start reciving...!"); //stopbutton.settext("stop reciving...!"); port=(edittext) findviewbyid(r.id.edittext1); //port.settext("1234"); audiomanager audiomanager = (audiomanager) this.getsystemservice(context.audio_service); // samplerate =integer.parseint( audiomanager.getproperty(audiomanager.property_output_sample_rate)); } private final onclicklistener stoplistener = new onclicklistener() { @override public void onclick(view v) { status = false; //recive.settext("recoder stop...!"); speaker.release(); log.d("vr","speaker released"); } }; private final onclicklistener receivelistener = new onclicklistener() { @override public void onclick(view arg0) { status = true; // recive.settext(" before start "); startreceiving(); } }; public void startreceiving() { thread receivethread = new thread (new runnable() { @override public void run() { runonuithread(new runnable() { @override public void run() { port_num=integer.parseint(port.gettext().tostring()); buffer= new byte[4096]; datagramsocket socket = null; try { socket = new datagramsocket(port_num); log.d("vr", "socket created"); speaker = new audiotrack(audiomanager.stream_voice_call,samplerate,channelconfig,audioformat,16000,audiotrack.mode_stream); //audiotrack.mode_stream, speaker.play(); while(status == true) { datagrampacket packet = new datagrampacket(buffer,buffer.length); socket.receive(packet); log.d("vr", "packet received"); //reading content packet buffer=packet.getdata(); log.d("vr", "packet data read buffer"); buffer= base64.decode(buffer, base64.default); //sending data audiotrack obj i.e. speaker speaker.write(buffer, 0, minbufsize); log.d("vr", "writing buffer content speaker"); } } catch (socketexception e) { // todo auto-generated catch block e.printstacktrace(); } catch (ioexception e) { // todo auto-generated catch block e.printstacktrace(); } } });} }); receivethread.start(); }}
client code:
package com.example.voicechatclient; import android.support.v7.app.actionbaractivity; import android.os.bundle; import android.view.menu; import android.view.menuitem; import android.app.activity; import java.io.ioexception; import java.net.datagrampacket; import java.net.datagramsocket; import java.net.inetaddress; import java.net.socketexception; import java.net.unknownhostexception; import android.content.context; import android.content.dialoginterface; import android.media.audioformat; import android.media.audiomanager; import android.media.audiorecord; import android.media.audiotrack; import android.media.mediarecorder; import android.util.base64; import android.util.log; import android.view.view; import android.view.view.onclicklistener; import android.widget.button; import android.widget.edittext; import android.widget.textview; public class mainactivity extends activity { private edittext target,target_port; private textview streaminglabel; private button startbutton,stopbutton; public byte[] buffer; public static datagramsocket socket; private int port=1370; audiorecord recorder; private int samplerate = 44100; private int channelconfig = audioformat.channel_in_mono; private int audioformat = audioformat.encoding_pcm_16bit; private boolean status = true; @override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); target = (edittext) findviewbyid (r.id.target_ip); streaminglabel = (textview) findviewbyid(r.id.streaming_label); startbutton = (button) findviewbyid (r.id.start_button); stopbutton = (button) findviewbyid (r.id.stop_button); target_port=(edittext) findviewbyid(r.id.target_port); streaminglabel.settext("press start! begin"); startbutton.setonclicklistener (startlistener); stopbutton.setonclicklistener (stoplistener); } private final onclicklistener stoplistener = new onclicklistener() { @override public void onclick(view arg0) { status = false; recorder.release(); log.d("vs","recorder released"); } }; private final onclicklistener startlistener = new onclicklistener() { @override public void onclick(view arg0) { status = true; startstreaming(); } }; public void startstreaming() { thread streamthread = new thread(new runnable() { @override public void run() { try { int minbufsize = audiorecord.getminbuffersize(samplerate, channelconfig, audioformat); datagramsocket socket = new datagramsocket(); log.d("vs", "socket created"); byte[] buffer = new byte[minbufsize]; log.d("vs","buffer created of size " + minbufsize); datagrampacket packet; final inetaddress destination = inetaddress.getbyname(target.gettext().tostring()); log.d("vs", "address retrieved"); recorder = new audiorecord(mediarecorder.audiosource.mic,samplerate,channelconfig,audioformat,minbufsize); log.d("vs", "recorder initialized"); recorder.startrecording(); while(status == true) { //reading data mic buffer minbufsize = recorder.read(buffer, 0, buffer.length); buffer= base64.encode(buffer, base64.default); //putting buffer in packet port=integer.parseint(target_port.gettext().tostring()); packet = new datagrampacket (buffer,buffer.length,destination,port); socket.send(packet); } } catch(unknownhostexception e) { log.e("vs", "unknownhostexception"); } catch (ioexception e) { log.e("vs", "ioexception"); } } }); streamthread.start(); } }
tested local ip address correctly. ip's 192.168.1.100 (my phone's ip) 10.0.2.2 , ....
you're question might have been answer here : https://stackoverflow.com/a/5440517/795245
if you're permission set correctly think problem device not support 44100 sample rate, , recorder may have not been initialized correctly.
add sanity check before creating audiorecord object after checking minbuffersize:
int minbufsize = audiorecord.getminbuffersize(samplerate, channelconfig, audioformat); if (minbufsize != audiorecord.error_bad_value) { // check if can instantiate , have success audiorecord recorder = new audiorecord(audiosource.default, rate, channelconfig, audioformat, minbufsize); if (recorder.getstate() == audiorecord.state_initialized) //do whatever want recorder recorder.startrecording(); ... } }
you should try out other sample rate values : { 8000, 11025, 22050, 44100 };
Comments
Post a Comment