Android Socket Client issue - java

I have a question regarding Android socket client application. I am suppose to use it to test the connection with a socket server software. But the application crashes everytime i press any of the button once. Does anyone know where the problem lies in my application?
package ab.2develop.Sockets;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.ToggleButton;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.Toast;
import android.os.SystemClock;
public class SocketsActivity extends Activity {
static final String NICKNAME = "abc";
Button btn_start;
public static ProgressBar progressBar;//id of progressbar
public static ProgressBar lamp1; //id of progressbar
public TextView txt_percentage;
//---socket---
InetAddress serverAddress;
Socket socket;
//---all the Views---
static TextView txtMessagesReceived;
static TextView numBytesReceived;
EditText txtMessage;
//---thread for communicating on the socket---
CommsThread commsThread;
//---used for updating the UI on the main activity---
static Handler UIupdater = new Handler() {
public int value1;
public int value2;
#Override
public void handleMessage(Message msg) {
int numOfBytesReceived = msg.arg1;
byte[] buffer = (byte[]) msg.obj;
//---convert the entire byte array to string---
String strReceived = new String(buffer);
//---extract only the actual string received---
strReceived = strReceived.substring(
0, numOfBytesReceived);
String strleft = strReceived.substring(0,3);
// value1++;
if (strleft.equals("111"))
{
value1++;
progressBar.setProgress(value1);
}
if (strleft.equals("110"))
{
value1--;
progressBar.setProgress(value1);
}
if (strleft.equals("221"))
{
value2++;
lamp1.setProgress(value2);
}
if (strleft.equals("220"))
{
value2--;
lamp1.setProgress(value2);
}
//---display the text received on the TextView---
txtMessagesReceived.setText("");
txtMessagesReceived.setText(
// txtMessagesReceived.getText().toString() +
// strReceived + numOfBytesReceived + value1);
txtMessagesReceived.getText().toString() + strleft + value1);
// numBytesReceived.setText(
// numBytesReceived.getText() );
}
};
private class CreateCommThreadTask extends AsyncTask
<Void, Integer, Void> {
#Override
protected Void doInBackground(Void... params) {
try {
//---create a socket---
serverAddress =
//InetAddress.getByName("192.168.1.105");
//socket = new Socket(serverAddress, 500);
InetAddress.getByName("192.168.0.200");
socket = new Socket(serverAddress, 5000);
commsThread = new CommsThread(socket);
commsThread.start();
//---sign in for the user; sends the nick name---
sendToServer(NICKNAME);
} catch (UnknownHostException e) {
Log.d("Sockets", e.getLocalizedMessage());
} catch (IOException e) {
Log.d("Sockets", e.getLocalizedMessage());
}
return null;
}
}
private class WriteToServerTask extends AsyncTask
<byte[], Void, Void> {
protected Void doInBackground(byte[]...data) {
commsThread.write(data[0]);
return null;
}
}
private class CloseSocketTask extends AsyncTask
<Void, Void, Void> {
#Override
protected Void doInBackground(Void... params) {
try {
socket.close();
} catch (IOException e) {
Log.d("Sockets", e.getLocalizedMessage());
}
return null;
}
}
/** Called when the activity is first created. */
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//---get the views---
txtMessagesReceived = (TextView)
findViewById(R.id.txtMessagesReceived);
btn_start = (Button) findViewById(R.id.btn_start);
progressBar = (ProgressBar) findViewById(R.id.progress);
lamp1 = (ProgressBar) findViewById(R.id.lamp1);
txt_percentage= (TextView) findViewById(R.id.txt_percentage);
btn_start.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
btn_start.setEnabled(false);
}
});
}
public void onClickSend(View view) {
//---send the message to the server---
sendToServer(txtMessage.getText().toString());
}
private void sendToServer(String message) {
byte[] theByteArray =
message.getBytes();
new WriteToServerTask().execute(theByteArray);
}
#Override
public void onResume() {
super.onResume();
new CreateCommThreadTask().execute();
}
#Override
public void onPause() {
super.onPause();
new CloseSocketTask().execute();
}
public void onClickLight11(View view) {
//---send the message to the server---
String str = "101".toString();
sendToServer(str);
//sendToServer(txtMessage.getText().toString());
}
public void onClickLight21(View view) {
//---send the message to the server---
String str = "201".toString();
sendToServer(str);
//sendToServer(txtMessage.getText().toString());
}
public void onClickLight31(View view) {
//---send the message to the server---
String str = "301".toString();
sendToServer(str);
//sendToServer(txtMessage.getText().toString());
}
public void onClickLight00(View view) {
//---send the message to the server---
String str = "000".toString();
sendToServer(str);
//sendToServer(txtMessage.getText().toString());
}
public void onClickLight55(View view) {
//---send the message to the server---
String str = "555".toString();
sendToServer(str);
//sendToServer(txtMessage.getText().toString());
}
public void onToggleClicked(View view) {
// Is the toggle on?
boolean on = ((ToggleButton) view).isChecked();
if (on) {
String str = "301".toString();
sendToServer(str);
} else {
String str = "000".toString();
sendToServer(str);
}
}
}
package ab.2develop.Sockets;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import android.util.Log;
public class CommsThread extends Thread {
private final Socket socket;
private final InputStream inputStream;
private final OutputStream outputStream;
public CommsThread(Socket sock) {
socket = sock;
InputStream tmpIn = null;
OutputStream tmpOut = null;
try {
//---creates the inputstream and outputstream objects
// for reading and writing through the sockets---
tmpIn = socket.getInputStream();
tmpOut = socket.getOutputStream();
} catch (IOException e) {
Log.d("SocketChat", e.getLocalizedMessage());
}
inputStream = tmpIn;
outputStream = tmpOut;
}
public void run() {
//---buffer store for the stream---
byte[] buffer = new byte[1024];
//---bytes returned from read()---
int bytes;
//---keep listening to the InputStream until an
// exception occurs---
while (true) {
try {
//---read from the inputStream---
bytes = inputStream.read(buffer);
//---update the main activity UI---
SocketsActivity.UIupdater.obtainMessage(
0,bytes, -1, buffer).sendToTarget();
} catch (IOException e) {
break;
}
}
}
//---call this from the main activity to
// send data to the remote device---
public void write(byte[] bytes) {
try {
outputStream.write(bytes);
} catch (IOException e) { }
}
//---call this from the main activity to
// shutdown the connection---
public void cancel() {
try {
socket.close();
} catch (IOException e) { }
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<Button
android:id="#+id/btn_start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="#+id/progress"
android:layout_centerHorizontal="true"
android:layout_marginTop="40dp"
android:minWidth="120dp"
android:text="#string/start_btn" />
<TextView
android:id="#+id/txtMessagesReceived"
android:layout_width="fill_parent"
android:layout_height="80dp"
android:textSize="30dip"
android:text="#string/msg_received"
android:scrollbars = "vertical" />
<TextView
android:id="#+id/txt_percentage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="#+id/progress"
android:text="downloading 0%"
android:textAppearance="?android:attr/textAppearanceMedium" />
<TextView
android:id="#+id/numBytesReceived"
android:layout_width="fill_parent"
android:layout_height="80dp"
android:textSize="30dip"
android:text="#string/num_msg_received"
android:scrollbars = "vertical" />
<Button
android:id="#+id/Light11"
android:textSize="30dip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClickLight11"
android:text="#string/button_send_Light11" />
<Button
android:id="#+id/Light21"
android:textSize="30dip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClickLight21"
android:text="#string/button_send_Light21" />
<Button
android:id="#+id/Light31"
android:textSize="30dip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClickLight31"
android:text="#string/button_send_Light31" />
<Button
android:id="#+id/Light00"
android:textSize="30dip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClickLight00"
android:text="#string/button_send_Light00" />
<Button
android:id="#+id/Light55"
android:textSize="30dip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClickLight55"
android:text="#string/button_send_Light55" />
<ToggleButton
android:id="#+id/togglebutton"
android:textSize="30dip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textOn="Light1 on"
android:textOff="Light1 off"
android:onClick="onToggleClicked"/>
<ProgressBar
android:id="#+id/progress"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="#+id/textView1"
android:layout_marginTop="34dp" />
<ProgressBar
android:id="#+id/lamp1"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="34dp" />
</LinearLayout>

Check your stack trace. The exception is thrown by
commsThread.write(data[0]);
That clearly indicates that either commsThread or data is null.

Related

I can save with file writer which is get data from bluetooth

I am developing android project to receive Bluetooth signal from Bluetooth device h6. Then save this data in my application as internally. Now i can get data from device. But trooblr is still i can't save data internally. In this code compile error is being come. I can't understand how solve that error. I am using android studio 3.1.2 and using 27 Api version. My Java cod is
package com.example.randikawann.androidbluetoothh6;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.Intent;
import android.media.MediaScannerConnection;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.Set;
import java.util.UUID;
import java.io.FileOutputStream;
import java.io.FileWriter;
public class MainActivity extends AppCompatActivity {
// private final String DEVICE_NAME="MyBTBee";
private final String DEVICE_ADDRESS="20:15:07:27:46:85";
private final UUID PORT_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");//Serial Port Service ID
private static final String TAG = "MyActivity";
private BluetoothDevice device;
private BluetoothSocket socket;
private OutputStream outputStream;
private InputStream inputStream;
Button startButton, sendButton,clearButton,stopButton;
TextView textView;
EditText editText;
boolean deviceConnected=false;
Thread thread;
byte buffer[];
int bufferPosition;
boolean stopThread;
String string;
private static final String FILE_NAME = "example.txt";
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
startButton = (Button) findViewById(R.id.buttonStart);
sendButton = (Button) findViewById(R.id.buttonSend);
clearButton = (Button) findViewById(R.id.buttonClear);
stopButton = (Button) findViewById(R.id.buttonStop);
editText = (EditText) findViewById(R.id.editText);
textView = (TextView) findViewById(R.id.textView);
setUiEnabled(false);
}
public void setUiEnabled(boolean bool)
{
startButton.setEnabled(!bool);
sendButton.setEnabled(bool);
stopButton.setEnabled(bool);
textView.setEnabled(bool);
}
public boolean BTinit()
{
boolean found=false;
BluetoothAdapter bluetoothAdapter=BluetoothAdapter.getDefaultAdapter();
if (bluetoothAdapter == null) {
Toast.makeText(getApplicationContext(),"Device doesnt Support Bluetooth",Toast.LENGTH_SHORT).show();
}
if(!bluetoothAdapter.isEnabled())
Toast.makeText(getApplicationContext(),"Bluetooth adapter not anabled",Toast.LENGTH_SHORT).show();
{
Intent enableAdapter = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableAdapter, 0);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Set<BluetoothDevice> bondedDevices = bluetoothAdapter.getBondedDevices();
Toast.makeText(getApplicationContext(),"find bounded device",Toast.LENGTH_SHORT).show();
if(bondedDevices.isEmpty())
{
Toast.makeText(getApplicationContext(),"Please Pair the Device first",Toast.LENGTH_SHORT).show();
}
else
{
for (BluetoothDevice iterator : bondedDevices)
{
if(iterator.getAddress().equals(DEVICE_ADDRESS))
{
device=iterator;
found=true;
break;
}
}
}
return found;
}
public boolean BTconnect()
{
boolean connected=true;
try {
socket = device.createRfcommSocketToServiceRecord(PORT_UUID);
socket.connect();
} catch (IOException e) {
e.printStackTrace();
connected=false;
}
if(connected)
{
try {
outputStream=socket.getOutputStream();
} catch (IOException e) {
e.printStackTrace();
}
try {
inputStream=socket.getInputStream();
} catch (IOException e) {
e.printStackTrace();
}
}
return connected;
}
public void onClickStart(View view) {
if(BTinit())
{
if(BTconnect())
{
setUiEnabled(true);
deviceConnected=true;
beginListenForData();
textView.append("\nConnection Opened!\n");
}
}
}
void beginListenForData()
{
final Handler handler = new Handler();
stopThread = false;
buffer = new byte[1024];
Thread thread = new Thread(new Runnable()
{
public void run()
{
while(!Thread.currentThread().isInterrupted() && !stopThread) {
try {
int byteCount = inputStream.available();
if (byteCount > 0) {
byte[] rawBytes = new byte[byteCount];
inputStream.read(rawBytes);
string = new String(rawBytes, "UTF-8");
handler.post(new Runnable() {
public void run() {
textView.setText(string);
Log.i(TAG, "***************************" + string);
//store value from file
save();
}
});
}
} catch (IOException ex) {
stopThread = true;
}
}
}
});
thread.start();
}
//Save input value
public void save() {
String text = string;
FileOutputStream fos = null;
try {
fos = openFileOutput(FILE_NAME, MODE_PRIVATE);
fos.write(text.getBytes());
Toast.makeText(this, "Saved to " + getFilesDir() + "/" + FILE_NAME,
Toast.LENGTH_LONG).show();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//Read saved files
public void load(View v) {
FileInputStream fis = null;
try {
fis = openFileInput(FILE_NAME);
InputStreamReader isr = new InputStreamReader(fis);
BufferedReader br = new BufferedReader(isr);
StringBuilder sb = new StringBuilder();
String text;
while ((text = br.readLine()) != null) {
sb.append(text).append("\n");
}
editText.setText(sb.toString());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public void onClickSend(View view) {
String string = editText.getText().toString();
string.concat("\n");
try {
outputStream.write(string.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
textView.append("\nSent Data:"+string+"\n");
}
public void onClickStop(View view) throws IOException {
stopThread = true;
outputStream.close();
inputStream.close();
socket.close();
setUiEnabled(false);
deviceConnected=false;
textView.append("\nConnection Closed!\n");
}
public void onClickClear(View view) {
textView.setText("");
}
}
Also my activity xml file is
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:minHeight="14dp"
tools:context=".MainActivity"
tools:layout_editor_absoluteY="81dp">
<EditText
android:id="#+id/editText"
android:layout_width="364dp"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="10dp"
android:layout_marginStart="10dp"
android:layout_marginTop="70dp"
android:inputType=""
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="#+id/buttonStart"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_below="#+id/editText"
android:layout_marginLeft="10dp"
android:layout_marginStart="10dp"
android:layout_marginTop="50dp"
android:onClick="onClickStart"
android:text="#string/begin"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="#+id/editText"
tools:ignore="OnClick" />
<Button
android:id="#+id/buttonSend"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="#+id/editText"
android:layout_marginEnd="196dp"
android:layout_marginLeft="5dp"
android:layout_marginRight="196dp"
android:layout_marginStart="5dp"
android:layout_marginTop="50dp"
android:layout_toEndOf="#+id/buttonStart"
android:layout_toRightOf="#+id/buttonStart"
android:onClick="onClickSend"
android:text="#string/send"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="#+id/buttonStart"
app:layout_constraintTop_toBottomOf="#+id/editText"
tools:ignore="OnClick,UnknownId" />
<Button
android:id="#+id/button0Stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="#+id/editText"
android:layout_marginLeft="5dp"
android:layout_marginStart="5dp"
android:layout_marginTop="50dp"
android:layout_toEndOf="#+id/buttonSend"
android:layout_toRightOf="#+id/buttonSend"
android:onClick="onClickStop"
android:text="#string/stop"
app:layout_constraintStart_toEndOf="#+id/buttonSend"
app:layout_constraintTop_toBottomOf="#+id/editText"
tools:ignore="OnClick" />
<Button
android:id="#+id/buttonClear"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="#+id/editText"
android:layout_marginLeft="5dp"
android:layout_marginStart="5dp"
android:layout_marginTop="50dp"
android:onClick="onClickClear"
android:text="#string/clear"
app:layout_constraintStart_toEndOf="#+id/button0Stop"
app:layout_constraintTop_toBottomOf="#+id/editText"
tools:ignore="OnClick" />
<TextView
android:id="#+id/textView"
android:layout_width="183dp"
android:layout_height="111dp"
android:layout_marginEnd="157dp"
android:layout_marginRight="157dp"
android:layout_marginTop="92dp"
android:text="TextView"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="#+id/buttonStart" />
</android.support.constraint.ConstraintLayout>
and also compile error is . I hope your immidiate answer
About file save, In Android (6.0+), I must be write files in /data directory, only with permission do write (without manifest permissions)
Example:
String directory = "/Android/data/" + getPackageName();
String pathToSave = directory + "/" + FILE_NAME;
About error, I need more details

Variable string in setCommand function of JSch Android

I want to execute the following command through ssh on my raspberry pi from Android App:
echo 'value of a variable string named cmd' > filename.txt
I tried following:
String a="echo '";
String c="' > filename.txt";
String cmd=a+clip+b;
channelSsh.setCommand(cmd);
Normal commands like "sudo reboot" works but not this!
My Program is a bit long but You can find a simple program of JSch implementation Here (The second answer).
If you still want to look at my code (things are in copyMethod() and executeRemoteCommand() function):
JAVA:
package com.quickclip.panky.quickclip;
import android.app.Activity;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import java.io.ByteArrayOutputStream;
import java.util.Properties;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
EditText e1;
Button b1,b2,b3;
TextView t1,t2;
Activity activity = this;
static int flag=2,time=3000;
static ClipData clip=null;
String output;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
e1 = (EditText) findViewById(R.id.editText);
t1 = (TextView) findViewById(R.id.textView);
t2 = (TextView) findViewById(R.id.textView3);
b1 = (Button) findViewById(R.id.button1);
b2 = (Button) findViewById(R.id.button2);
b3 = (Button) findViewById(R.id.button3);
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
b1.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View view) {
CopyMethod();
}
});
b2.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View view) {
VolDown();
}
});
b3.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View view) {
CopyPace();
}
});
Runnable myRunnable = new Runnable() {
#Override
public void run() {
while (true) {
if (flag % 2 == 0) {
try {
Thread.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
} else if (flag % 2 != 0) {
try {
Thread.sleep(800);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
activity.runOnUiThread(new Runnable() {
public void run() {
CopyMethod();
flag += 1;
}
});
}
}
};
Thread myThread = new Thread(myRunnable);
myThread.start();
}
public void VolDown(View view) {VolDown();}
public void CopyPace(View view) {CopyPace();}
public void ManCopy(View view) {CopyMethod();}
public void VolDown() {
ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("Copied Text","decrease volume");
clipboard.setPrimaryClip(clip);
}
public void CopyPace() {
if(time==5000) time=2000;
else if(time<5000) time+=1000;
t1.setText("Automatically Sending in: "+(time/1000)+" sec");
}
public void CopyMethod() {
ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("Copied Text", (CharSequence) e1.getText().toString());
clipboard.setPrimaryClip(clip);
new AsyncTask<Integer, Void, Void>(){
#Override
protected Void doInBackground(Integer... params) {
try {
output=executeRemoteCommand();
t2.setText(output);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}.execute(1);
e1.setText("");
}
public static String executeRemoteCommand()
throws Exception {
String username="pi";
String password="10<,mmXLSQ";
String hostname="192.168.43.41";
int port=22;
String a="echo '",c="' > yo.txt";
JSch jsch = new JSch();
Session session = jsch.getSession(username, hostname, port);
session.setPassword(password);
// Avoid asking for key confirmation
Properties prop = new Properties();
prop.put("StrictHostKeyChecking", "no");
session.setConfig(prop);
session.connect();
// SSH Channel
ChannelExec channelSsh = (ChannelExec)
session.openChannel("exec");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
channelSsh.setOutputStream(baos);
// Execute command
String cmd=a+clip+c;
channelSsh.setCommand(cmd);
channelSsh.connect();
channelSsh.disconnect();
return baos.toString();
}
#Override
public void onClick(View view) {CopyMethod();VolDown();CopyPace();}
}
XML:
<?xml version="1.0" encoding="utf-8"?>
<android.widget.RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.quickclip.panky.quickclip.MainActivity">
<EditText
android:id="#+id/editText"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="30dp"
android:ems="100"
android:inputType="textAutoCorrect" />
<Button
android:id="#+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_below="#+id/editText"
android:text="Send it Now"
android:onClick="ManCopy"/>
<Button
android:id="#+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_below="#+id/editText"
android:text="Volume Down"
android:onClick="VolDown"/>
<Button
android:id="#+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="#+id/editText"
android:layout_centerHorizontal="true"
android:text="Switch Pace"
android:onClick="CopyPace"/>
<TextView
android:id="#+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="#+id/button"
android:layout_centerHorizontal="true"
android:textSize="20dp"
android:layout_marginTop="130dp"
android:text="Automatically Sending in: 3 sec" />
<TextView
android:id="#+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="#+id/textView"
android:layout_centerHorizontal="true"
android:textSize="20dp"
android:text="Speak/Type in this time" />
<TextView
android:id="#+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="#+id/textView2"
android:layout_centerHorizontal="true"
android:textSize="20dp"
android:text="Connecting to SSH" />
</android.widget.RelativeLayout>
the clip inside the executeRemoteCommand() method in always null where you used String cmd=a+clip+c;
And you are calling ClipData.toString() here which returns string representation of the object
to get the text from ClipData use
String text = "";
ClipData clip = getPrimaryClip();
if (clip != null && clip.getItemCount() > 0) {
text = clip.getItemAt(0).coerceToText(mContext);
}
it will retrieves the primary clip and coerce it to a string
use Log to log the command before executing and check if you are using the correct command
I solved my problem,... thankyou for your time... thnx Arpan...
package com.quickclip.panky.quickclip;
import android.app.Activity;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import java.io.ByteArrayOutputStream;
import java.util.Properties;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
EditText e1;
Button b1,b2,b3;
TextView t1,t2;
Activity activity = this;
static int flag=2,time=3000;
static ClipData clip=null;
String output;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
e1 = (EditText) findViewById(R.id.editText);
t1 = (TextView) findViewById(R.id.textView);
t2 = (TextView) findViewById(R.id.textView3);
b1 = (Button) findViewById(R.id.button1);
b2 = (Button) findViewById(R.id.button2);
b3 = (Button) findViewById(R.id.button3);
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
b1.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View view) {
CopyMethod();
}
});
b2.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View view) {
VolDown();
}
});
b3.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View view) {
CopyPace();
}
});
Runnable myRunnable = new Runnable() {
#Override
public void run() {
while (true) {
if (flag % 2 == 0) {
try {
Thread.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
} else if (flag % 2 != 0) {
try {
Thread.sleep(800);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
activity.runOnUiThread(new Runnable() {
public void run() {
CopyMethod();
flag += 1;
}
});
}
}
};
Thread myThread = new Thread(myRunnable);
myThread.start();
}
public void VolDown(View view) {VolDown();}
public void CopyPace(View view) {CopyPace();}
public void ManCopy(View view) {CopyMethod();}
public void VolDown() {
ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("Copied Text","decrease volume");
clipboard.setPrimaryClip(clip);
}
public void CopyPace() {
if(time==5000) time=2000;
else if(time<5000) time+=1000;
t1.setText("Automatically Sending in: "+(time/1000)+" sec");
}
public void CopyMethod() {
final String username="pi";
final String password="10<,mmXLSQ";
final String hostname="192.168.43.41";
final int port=22;
final String a="echo '",c="' > panky.txt";
ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
final ClipData clip = ClipData.newPlainText("Copied Text", (CharSequence) e1.getText().toString());
clipboard.setPrimaryClip(clip);
new AsyncTask<Integer, Void, Void>(){
#Override
protected Void doInBackground(Integer... params) {
try {
JSch jsch = new JSch();
Session session = jsch.getSession(username, hostname, port);
session.setPassword(password);
// Avoid asking for key confirmation
Properties prop = new Properties();
prop.put("StrictHostKeyChecking", "no");
session.setConfig(prop);
session.connect();
// SSH Channel
ChannelExec channelSsh = (ChannelExec)
session.openChannel("exec");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
channelSsh.setOutputStream(baos);
// Execute command
String cmd=a+clip+c;
channelSsh.setCommand(cmd);
channelSsh.connect();
channelSsh.disconnect();
t2.setText(output);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}.execute(1);
e1.setText("");
}
#Override
public void onClick(View view) {CopyMethod();VolDown();CopyPace();}
}

How to put a progress bar with thread safety in android while hitting a server and waiting for response?

I have an application where I am recording audio in an activity. User has a start recording and stop recording button to do that. Once user clicks the stop recording button, it sends the recorded mp3 file to server (encoded string) and server process it and a response is received. I want to do the following tasks:
Since this process is long, I want to do this in a separate thread(preferably).
The process of sending and receiving response is to be shown using progress bar.
User should be able to navigate to other screens while he is waiting(i.e. current activity may be destroyed)
I tried using Toast messages before and after the function where I send mp3 to server. But there is no sync, sometimes msg comes early, sometime it's late. That's why a proper progress bar is required.How to do this? Can AsyncTask be used with what I want to achieve in (3). or should I use some other form of multithreading. Please help.Below is the activity
(Please ignore the indentations, I couldn't fix the code on stack-overflow:
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.net.Uri;
import android.os.Environment;
import android.os.Handler;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Base64;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import org.apache.commons.io.FileUtils;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
public class RecordActivity extends AppCompatActivity {
private static final String LOG_TAG = "AudioRecordTest";
private static String msg = "default";
public final static String Result_MESSAGE = "in.innovatehub.ankita_mehta.tinyears.ResultMESSAGE";
private static final int REQUESTCODE_RECORDING = 109201;
private Button mRecorderApp = null;
private static String mFileName = "music.mp3";
private static String mFilePath = String.valueOf(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS + "/TinyEars/"));
private MediaRecorder mRecorder = null;
private MediaPlayer mPlayer = null;
private ImageButton mRecordImageButton = null;
private ImageButton mPlayImageButton = null;
boolean mStartRecording = true;
boolean mStartPlaying = true;
private Button mShowStatsButton = null;
private static final String TAG = "RecordActivity";
private Handler handler = new Handler();
final Runnable updater = new Runnable() {
public void run() {
handler.postDelayed(this, 1);
if(mRecorder!=null) {
int maxAmplitude = mRecorder.getMaxAmplitude();
if (maxAmplitude != 0) {
// visualizerView.addAmplitude(maxAmplitude);
}
}
else{
}
}
};
private void onRecord(boolean start) {
if (start) {
startRecording();
} else {
stopRecording();
}
}
private void onPlay(boolean start) {
if (start) {
startPlaying();
} else {
stopPlaying();
}
}
private void startPlaying() {
mPlayer = new MediaPlayer();
try {
mPlayer.setDataSource(mFilePath+"/"+mFileName);
mPlayer.prepare();
mPlayer.start();
mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
public void onCompletion(MediaPlayer mp) {
Log.i("Completion Listener", "Song Complete");
stopPlaying();
mRecordImageButton.setEnabled(true);
}
});
} catch (IOException e) {
Log.e(LOG_TAG, "prepare() failed");
}
}
private void stopPlaying() {
if (mPlayer != null) {
mPlayer.reset();
mPlayer.release();
mPlayer = null;
mPlayImageButton.setImageResource(R.drawable.playicon);
// mStartPlaying = true;
} else {
mPlayImageButton.setImageResource(R.drawable.pauseicon);
// mStartPlaying = false;
}
}
private void startRecording() {
AudioRecordTest(String.valueOf(System.currentTimeMillis()));
mRecorder = new MediaRecorder();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mRecorder.setOutputFile(mFilePath+"/"+mFileName);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
try {
mRecorder.prepare();
} catch (IOException e) {
Log.e(LOG_TAG, "prepare() failed");
}
try {
mRecorder.start();
Toast.makeText(getApplicationContext(), "Recording started", Toast.LENGTH_LONG).show();
} catch (Exception e) {
Log.e(LOG_TAG, "start() failed");
}
}
private void stopRecording() {
if (mRecorder != null) {
mRecorder.stop();
mRecorder.release();
Toast.makeText(getApplicationContext(), "Audio recorded successfully",Toast.LENGTH_LONG).show();
mRecorder = null;
mRecordImageButton.setImageResource(R.drawable.micicon);
// mStartRecording = true;
} else {
mRecordImageButton.setImageResource(R.drawable.stopicon);
// mStartRecording = false;
}
}
public void AudioRecordTest(String text) {
boolean exists = (new File(mFilePath+"/"+mFileName)).exists();
if (!exists) {
new File(mFileName).mkdirs();
}
// mFileName += "audiorecordtest.mp3";
}
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_record);
Log.d(TAG,"HERE IS FILE PATH"+mFilePath+"/"+mFileName);
mRecordImageButton = (ImageButton) findViewById(R.id.imageButton2);
mPlayImageButton = (ImageButton) findViewById(R.id.imageButton3);
mShowStatsButton = (Button) findViewById(R.id.showMeStats);
mRecorderApp = (Button) findViewById(R.id.recorderApp);
AudioRecordTest("00000");
mRecordImageButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// Perform action on click
onRecord(mStartRecording);
if (mStartRecording) {
mRecordImageButton.setImageResource(R.drawable.stopicon);
mPlayImageButton.setEnabled(false);
//setText("Stop recording");
} else {
mRecordImageButton.setImageResource(R.drawable.micicon);
mPlayImageButton.setEnabled(true);
mShowStatsButton.setEnabled(true);
mShowStatsButton.setVisibility(View.VISIBLE);
Toast.makeText(getApplicationContext(),"Hold on... we are getting the results!",Toast.LENGTH_SHORT).show();
pressedSavBtn();
Toast.makeText(getApplicationContext(),"Parsing done ... now you may see the results!",Toast.LENGTH_SHORT).show();
//setText("Start recording");
}
mStartRecording = !mStartRecording;
}
});
mPlayImageButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// Perform action on click
onPlay(mStartPlaying);
if (mStartPlaying) {
mPlayImageButton.setImageResource(R.drawable.pauseicon);
mRecordImageButton.setEnabled(false);
mShowStatsButton.setEnabled(false);
//setText("Stop playing");
} else {
mPlayImageButton.setImageResource(R.drawable.playicon);
mRecordImageButton.setEnabled(true);
mShowStatsButton.setEnabled(false);
//setText("Start playing");
}
mStartPlaying = !mStartPlaying;
}
});
//Calling recorder ...
mRecorderApp.setOnClickListener(new View.OnClickListener(){
#Override
public void onClick(View view) {
Intent intent = new Intent(MediaStore.Audio.Media.RECORD_SOUND_ACTION);
if (isAvailable(getApplicationContext(), intent)) {
startActivityForResult(intent, REQUESTCODE_RECORDING);
}
}
});
mShowStatsButton = (Button) findViewById(R.id.showMeStats);
mShowStatsButton.setOnClickListener(new View.OnClickListener(){
#Override
public void onClick(View view) {
sendResults(msg);
}
});
}
public void pressedSavBtn(){
try {
thread.start();
} catch (Exception ex) {
ex.printStackTrace();
} finally {
mShowStatsButton.setVisibility(View.VISIBLE);
}
}
public void writeToFile(String data)
{
// Get the directory for the user's public pictures directory.
final File path = new File(mFilePath+"/");
// Make sure the path directory exists.
if(!path.exists())
{
// Make it, if it doesn't exit
path.mkdirs();
}
final File file = new File(path, "config.txt");
// Save your stream, don't forget to flush() it before closing it.
try
{
file.createNewFile();
FileOutputStream fOut = new FileOutputStream(file);
OutputStreamWriter myOutWriter = new OutputStreamWriter(fOut);
myOutWriter.append(data);
myOutWriter.close();
fOut.flush();
fOut.close();
}
catch (IOException e)
{
Log.e("Exception", "File write failed: " + e.toString());
}
}
private static String convertStreamToString(InputStream is) {
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuilder sb = new StringBuilder();
String line = null;
try {
while ((line = reader.readLine()) != null) {
sb.append((line + "\n"));
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return sb.toString();
}
Thread thread = new Thread(new Runnable() {
#Override
public void run() {
try {
//THIS IS FILE ENCODING CODE
File file = new File(mFilePath+"/"+mFileName);
byte[] bytes = FileUtils.readFileToByteArray(file);
String encoded = Base64.encodeToString(bytes, 0);
Log.d("~~~~~~~~ Encoded: ", encoded);
writeToFile(encoded);
//THIS IS URL CONN CODE
String link = "http://192.168.50.0:9000/divide_result";
URL url = new URL(link);
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(link);
try {
// Add your data
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
nameValuePairs.add(new BasicNameValuePair("Name", "StackOverFlow"));
nameValuePairs.add(new BasicNameValuePair("Date", encoded));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
// Execute HTTP Post Request
HttpResponse response = httpclient.execute(httppost);
String sb = convertStreamToString(response.getEntity().getContent());
Log.d(TAG,"MESSAGE NOW"+sb);
Log.d(TAG, sb);
msg = sb.toString();
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
} catch (IOException e) {
// TODO Auto-generated catch block
}
} catch (Exception e) {
e.printStackTrace();
}
}
});
public void sendResults(String res){
Log.d(TAG, "Inside on create, Navigating to Result Screen Activity!");
Intent intent = new Intent(getApplicationContext(), ResultsScreenActivity.class);
intent.putExtra(Result_MESSAGE, res);
startActivity(intent);
}
public static boolean isAvailable(Context ctx, Intent intent) {
final PackageManager mgr = ctx.getPackageManager();
List<ResolveInfo> list = mgr.queryIntentActivities(intent,PackageManager.MATCH_DEFAULT_ONLY);
return list.size() > 0;
}
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
if (requestCode == REQUESTCODE_RECORDING) {
if (resultCode == RESULT_OK) {
Uri audioUri = intent.getData();
// make use of this MediaStore uri
// e.g. store it somewhere
}
else {
// react meaningful to problems
}
}
else {
super.onActivityResult(requestCode,
resultCode, intent);
}
}
#Override
public void onPause() {
super.onPause();
if (mRecorder != null) {
mRecorder.release();
mRecorder = null;
}
if (mPlayer != null) {
mPlayer.release();
mPlayer = null;
}
thread.stop();
}
#Override
protected void onDestroy() {
super.onDestroy();
handler.removeCallbacks(updater);
if(mRecorder!=null) {
mRecorder.stop();
mRecorder.reset();
mRecorder.release();
}
}
#Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
handler.post(updater);
}
}
Also below is the layout-xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="#+id/activity_record"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center|center_horizontal"
android:paddingBottom="#dimen/activity_vertical_margin"
android:paddingLeft="#dimen/activity_horizontal_margin"
android:paddingRight="#dimen/activity_horizontal_margin"
android:paddingTop="#dimen/activity_vertical_margin"
android:screenOrientation="portrait"
android:orientation="vertical"
tools:context="in.innovatehub.mobile.ankita_mehta.tinyears.RecordActivity">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="#+id/linearLayout_record"
android:orientation="vertical"
android:gravity="center">
<ImageButton
android:id="#+id/imageButton2"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_gravity="center"
android:scaleType="fitXY"
android:src="#drawable/micicon" />
<ImageButton
android:id="#+id/imageButton3"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_gravity="center"
android:scaleType="fitXY"
android:src="#drawable/playicon" />
<Button
android:id="#+id/showMeStats"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:visibility="gone"
android:onClick="loadStats"
android:text="#string/showMeStats" />
<Button
android:id="#+id/recorderApp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="invisible"
android:gravity="center"
android:text="#string/UseRecorderApp" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="#+id/loadStatsLinearLayout"
android:gravity="center"
android:visibility="gone"
android:orientation="vertical">
<TextView
android:id="#+id/loadingMessage"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="#string/loadingMessage"
/>
<ProgressBar
android:id="#+id/downloadProgress"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:indeterminate="true"
/>
</LinearLayout>
</LinearLayout>
You can use an IntentService to upload your content to the server. By default, it runs on a seperate thread and is not activity bound. Then use a broadcast receiver to communicate the result back to any activity. You can find an example here.
For the progress bar, you can create a notification and show the progress bar there, this will not block your application's UI.
For hitting the server at you should use AsyncTask or Runnable thread, without disturb the main tread
for custome progress dialog use the following code
xml file.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:background="#color/color_white"
android:padding="5dp" >
<ProgressBar
android:id="#+id/layCustomContentProgress"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="10dp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
android:id="#+id/layCustomProgressHeading"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Medium Text"
android:textAppearance="?android:attr/textAppearanceMedium" />
<TextView
android:id="#+id/layCustomProgressInfo"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Small Text"
android:textAppearance="?android:attr/textAppearanceSmall" />
</LinearLayout>
</LinearLayout>
and the method
public Dialog getCustomPogressDialog(Context context, String heading, String text) {
// Declare the customer dialog
Dialog dlgProgress = new Dialog(context);
// Set no title for the dialog
dlgProgress.requestWindowFeature(Window.FEATURE_NO_TITLE);
// Set the content view to the customer_alert layout
dlgProgress.setContentView(R.layout.layout_custom_process_progress);
// Cancel the dialog when touched outside.
dlgProgress.setCanceledOnTouchOutside(false);
// Set the main heading
TextView dlgHeading = (TextView) dlgProgress.findViewById(R.id.layCustomProgressHeading);
dlgHeading.setText(heading);
// set the info
TextView dlgInfo = (TextView) dlgProgress.findViewById(R.id.layCustomProgressInfo);
dlgInfo.setText(text);
// Return the refenrece to the dialog
return dlgProgress;
}

Onclicklistener only working once

My onclicklistener for my "LoginBtn". However that code inside that block only runs once and then doesn't run ever again. Please help me, I've tried everything. I know so because I have ran the log and it only logs out the value once and then never again.
package com.example.jj.test;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.ScaleDrawable;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.AppCompatDrawableManager;
import android.util.Log;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;
import com.goebl.david.Webb;
import org.json.JSONException;
import org.json.JSONObject;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private static final String TAG = "test";
boolean loginform;
Button Loginbtn;
ImageView logoIV;
String email;
String password;
String token;
EditText emailET;
EditText passwordET;
final Webb webb = Webb.create();
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Loginbtn = (Button) findViewById(R.id.loginbtn);
Loginbtn.setOnClickListener(this);
logoIV = (ImageView) findViewById(R.id.logoIV);
emailET = (EditText) findViewById(R.id.emailET);
passwordET = (EditText) findViewById(R.id.passwordET);
loginform = false;
ModifyEditText();
}
public void ModifyEditText(){
Drawable drawable = getResources().getDrawable(R.mipmap.email);
drawable.setBounds(0, 0, (int) (drawable.getIntrinsicWidth() * 0.6),
(int) (drawable.getIntrinsicHeight() * 0.6));
ScaleDrawable sd = new ScaleDrawable(drawable, 0, 40, 40);
emailET.setCompoundDrawables(null, null,sd.getDrawable(), null);
drawable = getResources().getDrawable(R.mipmap.password);
drawable.setBounds(0, 0, (int) (drawable.getIntrinsicWidth() * 0.6),
(int) (drawable.getIntrinsicHeight() * 0.6));
sd = new ScaleDrawable(drawable, 0, 40, 40);
passwordET.setCompoundDrawables(null, null, sd.getDrawable(), null);
final Drawable d = emailET.getBackground();
final Drawable nd = d.getConstantState().newDrawable();
nd.setColorFilter(AppCompatDrawableManager.getPorterDuffColorFilter(
Color.parseColor("#FFFFFF"), PorterDuff.Mode.SRC_IN));
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
emailET.setBackground(nd);
passwordET.setBackground(nd);
}
}
public void startAnimation() {
Loginbtn.setText("Login");
logoIV.startAnimation(AnimationUtils.loadAnimation(this, R.anim.animmovetop));
Loginbtn.startAnimation(AnimationUtils.loadAnimation(this, R.anim.animmovedown));
Animation animFadeIn = AnimationUtils.loadAnimation(this, android.R.anim.fade_in);
emailET.setAnimation(animFadeIn);
passwordET.setAnimation(animFadeIn);
emailET.setVisibility(View.VISIBLE);
passwordET.setVisibility(View.VISIBLE);
Loginbtn.setBackgroundResource(R.drawable.transparentrectangel);
loginform = true;
}
public void LoginRequest(final JSONObject id) throws Exception {
final String testurl = "http://api.dermatrax.com/api/v1/token/generate?email="+email+"&password="+password+;
new AsyncTask<Void, Void, JSONObject>() {
#Override
protected JSONObject doInBackground(Void... params) {
try {
Log.d("TEST","Sending request");
JSONObject response = webb
.post(testurl)
.body(id)
.ensureSuccess()
.readTimeout(4000)
.asJsonObject()
.getBody();
return response;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
#Override
protected void onPostExecute(JSONObject result) {
if (result != null) {
Log.d("TEST", result.toString());
try {
JSONObject data = result.getJSONObject("data");
token = data.get("token").toString();
Log.d("TEST", token);
if (token != null && !token.isEmpty()) {
Intent intent = new Intent(getApplicationContext(), UserData.class);
intent.putExtra("token", token);
intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(intent);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
else{
Toast.makeText(getApplicationContext(),"Wrong email or password",Toast.LENGTH_LONG);
}
}
}.execute().get();
//executeOnExecutor(AsyncTask.SERIAL_EXECUTOR);
}
#Override
public void onClick(View v) {
if(v.getId() == R.id.loginbtn){
Log.d("TEST", "loginform is = " + loginform);
JSONObject params = new JSONObject();
if (loginform == false) {
try {
startAnimation();
//LoginRequest(params);
} catch (Exception e) {
e.printStackTrace();
}
} else if (loginform == true) {
email = emailET.getText().toString();
password = passwordET.getText().toString();
try {
//params.put("email", email);
//params.put("password", password);
params.put("email", "blabla#combustiongroup.com");
params.put("password", "blabla");
LoginRequest(params);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
xml code
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
tools:context="com.example.jj.test.MainActivity">
<RelativeLayout
android:background="#292446"
android:orientation="vertical"
android:id="#+id/midLL"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<Button
android:padding="10dp"
android:layout_width="300dp"
android:gravity="center"
android:layout_height="40dp"
android:text="Go"
android:id="#+id/loginbtn"
android:textColor="#FFFFFF"
android:background="#drawable/roundbutton"
android:layout_below="#+id/logoIV"
android:layout_centerHorizontal="true" />
<de.hdodenhof.circleimageview.CircleImageView
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="#+id/logoIV"
android:src="#mipmap/bigmatchlogo"
android:layout_width="70dp"
android:layout_height="70dp"
app:civ_border_width="2dp"
app:civ_border_color="#d6d6d6"
android:layout_alignBottom="#+id/emailET"
android:layout_centerHorizontal="true"
android:layout_marginBottom="20dp" />
<EditText
android:layout_marginBottom="10dp"
android:textColorHint="#FFFFFF"
android:hint="Email"
android:visibility="invisible"
android:layout_width="300dp"
android:layout_height="wrap_content"
android:inputType="textEmailAddress"
android:ems="10"
android:id="#+id/emailET"
android:layout_marginTop="217dp"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true" />
<EditText
android:drawableRight="#mipmap/password"
android:hint="Password"
android:textColorHint="#FFFFFF"
android:visibility="invisible"
android:layout_width="300dp"
android:layout_height="50dp"
android:inputType="textPassword"
android:ems="10"
android:layout_marginTop="10dp"
android:id="#+id/passwordET"
android:layout_below="#+id/emailET"
android:layout_alignLeft="#+id/emailET"
android:layout_alignStart="#+id/emailET" />
</RelativeLayout>
</LinearLayout>
Log cat
06-15 15:49:11.898 8631-8631/com.example.jj.test D/TEST: loginform is = false
06-15 15:50:36.598 8631-8631/com.example.jj.test D/szxszxszxszxszx: spannableStringBuilder.......1
06-15 15:50:36.598 8631-8631/com.example.jj.test D/szxszxszx: setSpan start is 0,end is 0,flags is 18boolena is false
Write this code inside onCreate()...
Loginbtn.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View view) {
if(v.getId() == R.id.loginbtn){
Log.d("TEST", "loginform is = " + loginform);
JSONObject params = new JSONObject();
if (loginform == false) {
try {
startAnimation();
//LoginRequest(params);
} catch (Exception e) {
e.printStackTrace();
}
} else if (loginform == true) {
email = emailET.getText().toString();
password = passwordET.getText().toString();
try {
//params.put("email", email);
//params.put("password", password);
params.put("email", "blabla#combustiongroup.com");
params.put("password", "blabla");
LoginRequest(params);
} catch (Exception e) {
e.printStackTrace();
}
}
}

Customize text inside Edittext for chatting

I want to customize the text inside the edittext of my chatting app. I want to bold the username and normal font for his message.
For example;
usernamejay: Hi This is Jay. How are you?
also make 1 space for reply after the message of usernamejay. i also want to change font color of username. Also if possible put message balloon for every message.
Example:
usernamejay: Hi This is Jay. How are you?
usernameclark: I'm Fine. Can i call you now for a meeting?
Can anyone help me how. This is the code for Java
import java.io.UnsupportedEncodingException;
import com.example.healthhelpv2.*;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.NotificationManager;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.database.Cursor;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnKeyListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import at.vcity.androidim.interfaces.IAppManager;
import at.vcity.androidim.services.IMService;
import at.vcity.androidim.tools.FriendController;
import at.vcity.androidim.tools.LocalStorageHandler;
import at.vcity.androidim.types.FriendInfo;
import at.vcity.androidim.types.MessageInfo;
public class Messaging extends Activity {
private static final int MESSAGE_CANNOT_BE_SENT = 0;
public String username;
private EditText messageText;
private EditText messageHistoryText;
private Button sendMessageButton;
private IAppManager imService;
private FriendInfo friend = new FriendInfo();
private LocalStorageHandler localstoragehandler;
private Cursor dbCursor;
private ServiceConnection mConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder service) {
imService = ((IMService.IMBinder)service).getService();
}
public void onServiceDisconnected(ComponentName className) {
imService = null;
Toast.makeText(Messaging.this, R.string.local_service_stopped,
Toast.LENGTH_SHORT).show();
}
};
#Override
protected void onCreate(Bundle savedInstanceState)
{
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.messaging_screen); //messaging_screen);
messageHistoryText = (EditText) findViewById(R.id.messageHistory);
messageText = (EditText) findViewById(R.id.message);
messageText.requestFocus();
sendMessageButton = (Button) findViewById(R.id.sendMessageButton);
Bundle extras = this.getIntent().getExtras();
friend.userName = extras.getString(FriendInfo.USERNAME);
friend.ip = extras.getString(FriendInfo.IP);
friend.port = extras.getString(FriendInfo.PORT);
String msg = extras.getString(MessageInfo.MESSAGETEXT);
setTitle("Messaging with " + friend.userName);
// EditText friendUserName = (EditText) findViewById(R.id.friendUserName);
// friendUserName.setText(friend.userName);
localstoragehandler = new LocalStorageHandler(this);
dbCursor = localstoragehandler.get(friend.userName, IMService.USERNAME );
if (dbCursor.getCount() > 0){
int noOfScorer = 0;
dbCursor.moveToFirst();
while ((!dbCursor.isAfterLast())&&noOfScorer<dbCursor.getCount())
{
noOfScorer++;
this.appendToMessageHistory(dbCursor.getString(2) , dbCursor.getString(3));
dbCursor.moveToNext();
}
}
localstoragehandler.close();
if (msg != null)
{
this.appendToMessageHistory(friend.userName , msg);
((NotificationManager)getSystemService(NOTIFICATION_SERVICE)).cancel((friend.userName+msg).hashCode());
}
sendMessageButton.setOnClickListener(new OnClickListener(){
CharSequence message;
Handler handler = new Handler();
public void onClick(View arg0) {
message = messageText.getText();
if (message.length()>0)
{
appendToMessageHistory(imService.getUsername(), message.toString());
localstoragehandler.insert(imService.getUsername(), friend.userName, message.toString());
messageText.setText("");
Thread thread = new Thread(){
public void run() {
try {
if (imService.sendMessage(imService.getUsername(), friend.userName, message.toString()) == null)
{
handler.post(new Runnable(){
public void run() {
Toast.makeText(getApplicationContext(),R.string.message_cannot_be_sent, Toast.LENGTH_LONG).show();
//showDialog(MESSAGE_CANNOT_BE_SENT);
}
});
}
} catch (UnsupportedEncodingException e) {
Toast.makeText(getApplicationContext(),R.string.message_cannot_be_sent, Toast.LENGTH_LONG).show();
e.printStackTrace();
}
}
};
thread.start();
}
}});
messageText.setOnKeyListener(new OnKeyListener(){
public boolean onKey(View v, int keyCode, KeyEvent event)
{
if (keyCode == 66){
sendMessageButton.performClick();
return true;
}
return false;
}
});
}
#Override
protected Dialog onCreateDialog(int id) {
int message = -1;
switch (id)
{
case MESSAGE_CANNOT_BE_SENT:
message = R.string.message_cannot_be_sent;
break;
}
if (message == -1)
{
return null;
}
else
{
return new AlertDialog.Builder(Messaging.this)
.setMessage(message)
.setPositiveButton(R.string.OK, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
/* User clicked OK so do some stuff */
}
})
.create();
}
}
#Override
protected void onPause() {
super.onPause();
unregisterReceiver(messageReceiver);
unbindService(mConnection);
FriendController.setActiveFriend(null);
}
#Override
protected void onResume()
{
super.onResume();
bindService(new Intent(Messaging.this, IMService.class), mConnection , Context.BIND_AUTO_CREATE);
IntentFilter i = new IntentFilter();
i.addAction(IMService.TAKE_MESSAGE);
registerReceiver(messageReceiver, i);
FriendController.setActiveFriend(friend.userName);
}
public class MessageReceiver extends BroadcastReceiver {
#Override
public void onReceive(Context context, Intent intent)
{
Bundle extra = intent.getExtras();
String username = extra.getString(MessageInfo.USERID);
String message = extra.getString(MessageInfo.MESSAGETEXT);
if (username != null && message != null)
{
if (friend.userName.equals(username)) {
appendToMessageHistory(username, message);
localstoragehandler.insert(username,imService.getUsername(), message);
}
else {
if (message.length() > 15) {
message = message.substring(0, 15);
}
Toast.makeText(Messaging.this, username + " says '"+
message + "'",
Toast.LENGTH_SHORT).show();
}
}
}
};
private MessageReceiver messageReceiver = new MessageReceiver();
public void appendToMessageHistory(String username, String message) {
if (username != null && message != null) {
messageHistoryText.append(username + ":\n");
messageHistoryText.append(message + "\n");
}
}
#Override
protected void onDestroy() {
super.onDestroy();
if (localstoragehandler != null) {
localstoragehandler.close();
}
if (dbCursor != null) {
dbCursor.close();
}
}
}
The XML messaging_screen
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#ccbfbf"
android:orientation="vertical"
android:padding="10dip" >
<!--
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dip"
android:text="Friend:"
/>
<EditText android:id="#+id/friendUserName"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:clickable="true"
android:singleLine="true"
android:editable="false" />
-->
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dip"
android:text="Messages:"/>
<EditText android:id="#+id/messageHistory"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clickable="true"
android:layout_weight="1"
android:editable="false"
android:gravity="top"
android:scrollbars="vertical"
android:scrollbarSize="10px"
/>
<LinearLayout android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="4">
<EditText
android:id="#+id/message"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
android:gravity="top"
android:hint="Type message here!" />
<Button android:id="#+id/sendMessageButton"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="4"
android:text="Send"/>
</LinearLayout>
</LinearLayout>
Do this way Hope this works for you
EditText editText = (EditText)findViewById(R.id.editText);
String userName = "usernamejay";
String message = "Hi This is Jay. How are you?";
String finalStr = "<b>"+userName+":</b> "+message+"";
editText.setText(Html.fromHtml(finalStr));
On Android you can use HTML to style the text inside a TextView, see here http://daniel-codes.blogspot.pt/2011/04/html-in-textviews.html
You could also use a spannable string, may be you could look at a portion of the code in this answer.
A code extract from the link
final SpannableString out0 = new SpannableString(source[position]);
StyleSpan boldSpan = new StyleSpan(Typeface.BOLD);
out0.setSpan(boldSpan, 6, 17, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
holder.tv.setText(out0);
P.S: but please read the solution in the link before you start applying things in your code.

Categories

Resources