Related
Hi all, I'm fairly new to Java and my overall coding skills are not as advanced as I'd like them to be but I really would appreciate it if someone could help me with this problem.
My first goal is to code an application for Android which measures the acceleration (X, Y, Z directions) and displays the values in a TextView.
There will be other user configurable options like unit conversion or limits with audio warnings etc. later on.
Right now I only have a few lines of code and the application already force closes right after starting.
I am posting my MainActivity.java, my activity_main.xml and the sensoractivity2 Manifest. Please point me in the right direction!
MainActivity.java:
Code:
package com.example.sensoractivity2;
import android.app.Activity;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends Activity implements SensorEventListener{
private SensorManager sensorManager;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
sensorManager=(SensorManager) getSystemService(SENSOR_SERVICE);
sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
}
public void onSensorChanged(SensorEvent event) {
float x, y, z = 0;
if (event.sensor.getType()==Sensor.TYPE_ACCELEROMETER) {
x=event.values[0];
y=event.values[1];
z=event.values[2];
TextView tx = (TextView) findViewById(R.id.textView1);
tx.setText((int) x);
TextView ty = (TextView) findViewById(R.id.textView2);
ty.setText((int) y);
TextView tz = (TextView) findViewById(R.id.textView3);
tz.setText((int) z);
}
}
[user=439709]@override[/user]
public void onAccuracyChanged(Sensor arg0, int arg1) {
// TODO Auto-generated method stub
}
}
activity_main.xml
Code:
<?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="vertical" >
<TextView
android:id="@+id/textView1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="X-Wert" />
<TextView
android:id="@+id/textView2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="Y-Wert" />
<TextView
android:id="@+id/textView3"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="Z-Wert" />
</LinearLayout>
sensoractivity2 Manifest:
Code:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.sensoractivity2"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk
android:minSdkVersion="8"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">
<activity android:name="com.example.sensoractivity2.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
First thing I see is that you are not setting your view in your activity classes "oncreate" method. Can you post your logcat output when the app force closes? That will help the most.
Could you please post a logcat?
Just the lines of your app. Get it using the logcat view in Eclipse.
Look at the bold for changes that will help you. When you are working with view objects, you shouldn't create the object in a listener or something that is called over and over. You will be creating a memory leak.
Code:
package com.example.sensoractivity2;
import android.app.Activity;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends Activity implements SensorEventListener{
private SensorManager sensorManager;
[B]TextView tx = null;
TextView ty = null;
TextView tz = null;[/B]
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
sensorManager=(SensorManager) getSystemService(SENSOR_SERVICE);
[B] setContentView(R.layout.activity_main);[/B]
sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
[B]tx = (TextView) findViewById(R.id.textView1);
ty = (TextView) findViewById(R.id.textView2);
tz = (TextView) findViewById(R.id.textView3);[/B]
}
public void onSensorChanged(SensorEvent event) {
float x, y, z = 0;
if (event.sensor.getType()==Sensor.TYPE_ACCELEROMETER) {
x=event.values[0];
y=event.values[1];
z=event.values[2];
[B]tx.setText((int) x);
ty.setText((int) y);
tz.setText((int) z);[/B]
}
}
[user=439709]@override[/user]
public void onAccuracyChanged(Sensor arg0, int arg1) {
// TODO Auto-generated method stub
}
}
Here is the part of the catlog which I believe to be relevant when the crash occurs:
Code:
04-28 18:34:24.628: E/SurfaceFlinger(36): ro.sf.lcd_density must be defined as a build property
04-28 18:34:25.750: E/Trace(1735): error opening trace file: No such file or directory (2)
04-28 18:34:27.452: I/ARMAssembler(36): generated scanline__00000077:03515104_00009002_00000000 [127 ipp] (149 ins) at [0x40f081f0:0x40f08444] in 34521256 ns
04-28 18:34:29.430: I/Choreographer(1153): Skipped 388 frames! The application may be doing too much work on its main thread.
04-28 18:34:29.462: I/ARMAssembler(36): generated scanline__00000077:03010104_00008002_00000000 [ 89 ipp] (110 ins) at [0x40f08450:0x40f08608] in 17654283 ns
04-28 18:34:30.825: W/ActivityManager(1003): Launch timeout has expired, giving up wake lock!
04-28 18:34:31.673: D/AndroidRuntime(1735): Shutting down VM
04-28 18:34:31.673: W/dalvikvm(1735): threadid=1: thread exiting with uncaught exception (group=0x40a71930)
04-28 18:34:31.737: E/AndroidRuntime(1735): FATAL EXCEPTION: main
04-28 18:34:31.737: E/AndroidRuntime(1735): java.lang.NullPointerException
04-28 18:34:31.737: E/AndroidRuntime(1735): at com.example.sensoractivity2.MainActivity.onSensorChanged(MainActivity.java:27)
04-28 18:34:31.737: E/AndroidRuntime(1735): at android.hardware.SystemSensorManager$ListenerDelegate$1.handleMessage(SystemSensorManager.java:204)
04-28 18:34:31.737: E/AndroidRuntime(1735): at android.os.Handler.dispatchMessage(Handler.java:99)
04-28 18:34:31.737: E/AndroidRuntime(1735): at android.os.Looper.loop(Looper.java:137)
04-28 18:34:31.737: E/AndroidRuntime(1735): at android.app.ActivityThread.main(ActivityThread.java:5041)
04-28 18:34:31.737: E/AndroidRuntime(1735): at java.lang.reflect.Method.invokeNative(Native Method)
04-28 18:34:31.737: E/AndroidRuntime(1735): at java.lang.reflect.Method.invoke(Method.java:511)
04-28 18:34:31.737: E/AndroidRuntime(1735): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
04-28 18:34:31.737: E/AndroidRuntime(1735): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
04-28 18:34:31.737: E/AndroidRuntime(1735): at dalvik.system.NativeStart.main(Native Method)
04-28 18:34:31.813: W/ActivityManager(1003): Force finishing activity com.example.sensoractivity2/.MainActivity
04-28 18:34:31.893: W/WindowManager(1003): Failure taking screenshot for (328x583) to layer 21010
04-28 18:34:32.643: D/dalvikvm(1003): GC_FOR_ALLOC freed 588K, 26% free 7082K/9496K, paused 471ms, total 481ms
Thanks for your hints, zalez! Going to try that now.
The logcat states a nullpointer error. I believe my corrections will fix at least that error.
spelaben said:
Here is the part of the catlog which I believe to be relevant when the crash occurs:
Code:
04-28 18:34:24.628: E/SurfaceFlinger(36): ro.sf.lcd_density must be defined as a build property
04-28 18:34:25.750: E/Trace(1735): error opening trace file: No such file or directory (2)
04-28 18:34:27.452: I/ARMAssembler(36): generated scanline__00000077:03515104_00009002_00000000 [127 ipp] (149 ins) at [0x40f081f0:0x40f08444] in 34521256 ns
04-28 18:34:29.430: I/Choreographer(1153): Skipped 388 frames! The application may be doing too much work on its main thread.
04-28 18:34:29.462: I/ARMAssembler(36): generated scanline__00000077:03010104_00008002_00000000 [ 89 ipp] (110 ins) at [0x40f08450:0x40f08608] in 17654283 ns
04-28 18:34:30.825: W/ActivityManager(1003): Launch timeout has expired, giving up wake lock!
04-28 18:34:31.673: D/AndroidRuntime(1735): Shutting down VM
04-28 18:34:31.673: W/dalvikvm(1735): threadid=1: thread exiting with uncaught exception (group=0x40a71930)
04-28 18:34:31.737: E/AndroidRuntime(1735): FATAL EXCEPTION: main
04-28 18:34:31.737: E/AndroidRuntime(1735): java.lang.NullPointerException
04-28 18:34:31.737: E/AndroidRuntime(1735): at com.example.sensoractivity2.MainActivity.onSensorChanged(MainActivity.java:27)
04-28 18:34:31.737: E/AndroidRuntime(1735): at android.hardware.SystemSensorManager$ListenerDelegate$1.handleMessage(SystemSensorManager.java:204)
04-28 18:34:31.737: E/AndroidRuntime(1735): at android.os.Handler.dispatchMessage(Handler.java:99)
04-28 18:34:31.737: E/AndroidRuntime(1735): at android.os.Looper.loop(Looper.java:137)
04-28 18:34:31.737: E/AndroidRuntime(1735): at android.app.ActivityThread.main(ActivityThread.java:5041)
04-28 18:34:31.737: E/AndroidRuntime(1735): at java.lang.reflect.Method.invokeNative(Native Method)
04-28 18:34:31.737: E/AndroidRuntime(1735): at java.lang.reflect.Method.invoke(Method.java:511)
04-28 18:34:31.737: E/AndroidRuntime(1735): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
04-28 18:34:31.737: E/AndroidRuntime(1735): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
04-28 18:34:31.737: E/AndroidRuntime(1735): at dalvik.system.NativeStart.main(Native Method)
04-28 18:34:31.813: W/ActivityManager(1003): Force finishing activity com.example.sensoractivity2/.MainActivity
04-28 18:34:31.893: W/WindowManager(1003): Failure taking screenshot for (328x583) to layer 21010
04-28 18:34:32.643: D/dalvikvm(1003): GC_FOR_ALLOC freed 588K, 26% free 7082K/9496K, paused 471ms, total 481ms
Thanks for your hints, zalez! Going to try that now.
Click to expand...
Click to collapse
zalez said:
The logcat states a nullpointer error. I believe my corrections will fix at least that error.
Click to expand...
Click to collapse
True, nullpointer errors are fixed. After debugging it again, I'm getting these errors now:
Code:
04-28 19:07:59.466: E/AndroidRuntime(858): FATAL EXCEPTION: main
04-28 19:07:59.466: E/AndroidRuntime(858): android.content.res.Resources$NotFoundException: String resource ID #0x0
04-28 19:07:59.466: E/AndroidRuntime(858): at android.content.res.Resources.getText(Resources.java:230)
04-28 19:07:59.466: E/AndroidRuntime(858): at android.widget.TextView.setText(TextView.java:3769)
04-28 19:07:59.466: E/AndroidRuntime(858): at com.example.sensoractivity2.MainActivity.onSensorChanged(MainActivity.java:33)
04-28 19:07:59.466: E/AndroidRuntime(858): at android.hardware.SystemSensorManager$ListenerDelegate$1.handleMessage(SystemSensorManager.java:204)
04-28 19:07:59.466: E/AndroidRuntime(858): at android.os.Handler.dispatchMessage(Handler.java:99)
04-28 19:07:59.466: E/AndroidRuntime(858): at android.os.Looper.loop(Looper.java:137)
04-28 19:07:59.466: E/AndroidRuntime(858): at android.app.ActivityThread.main(ActivityThread.java:5041)
04-28 19:07:59.466: E/AndroidRuntime(858): at java.lang.reflect.Method.invokeNative(Native Method)
04-28 19:07:59.466: E/AndroidRuntime(858): at java.lang.reflect.Method.invoke(Method.java:511)
04-28 19:07:59.466: E/AndroidRuntime(858): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
04-28 19:07:59.466: E/AndroidRuntime(858): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
04-28 19:07:59.466: E/AndroidRuntime(858): at dalvik.system.NativeStart.main(Native Method)
Any ideas?
spelaben said:
True, nullpointer errors are fixed. After debugging it again, I'm getting these errors now:
Code:
04-28 19:07:59.466: E/AndroidRuntime(858): FATAL EXCEPTION: main
04-28 19:07:59.466: E/AndroidRuntime(858): android.content.res.Resources$NotFoundException: String resource ID #0x0
04-28 19:07:59.466: E/AndroidRuntime(858): at android.content.res.Resources.getText(Resources.java:230)
04-28 19:07:59.466: E/AndroidRuntime(858): at android.widget.TextView.setText(TextView.java:3769)
04-28 19:07:59.466: E/AndroidRuntime(858): at com.example.sensoractivity2.MainActivity.onSensorChanged(MainActivity.java:33)
04-28 19:07:59.466: E/AndroidRuntime(858): at android.hardware.SystemSensorManager$ListenerDelegate$1.handleMessage(SystemSensorManager.java:204)
04-28 19:07:59.466: E/AndroidRuntime(858): at android.os.Handler.dispatchMessage(Handler.java:99)
04-28 19:07:59.466: E/AndroidRuntime(858): at android.os.Looper.loop(Looper.java:137)
04-28 19:07:59.466: E/AndroidRuntime(858): at android.app.ActivityThread.main(ActivityThread.java:5041)
04-28 19:07:59.466: E/AndroidRuntime(858): at java.lang.reflect.Method.invokeNative(Native Method)
04-28 19:07:59.466: E/AndroidRuntime(858): at java.lang.reflect.Method.invoke(Method.java:511)
04-28 19:07:59.466: E/AndroidRuntime(858): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
04-28 19:07:59.466: E/AndroidRuntime(858): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
04-28 19:07:59.466: E/AndroidRuntime(858): at dalvik.system.NativeStart.main(Native Method)
Any ideas?
Click to expand...
Click to collapse
It needs to be
Code:
tx.setText(String.valueOf(x));
ty.setText(String.valueOf(y));
tz.setText(String.valueOf(z));
If you pass an int, the TextView thinks that it is a resource id. That is why you need to convert it to a String first.
I over looked the bold part. When setting text for a Textview, it has to be in string format. There is no implied conversion.
Code:
package com.example.sensoractivity2;
import android.app.Activity;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends Activity implements SensorEventListener{
private SensorManager sensorManager;
TextView tx = null;
TextView ty = null;
TextView tz = null;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
sensorManager=(SensorManager) getSystemService(SENSOR_SERVICE);
setContentView(R.layout.activity_main);
sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
tx = (TextView) findViewById(R.id.textView1);
ty = (TextView) findViewById(R.id.textView2);
tz = (TextView) findViewById(R.id.textView3);
}
public void onSensorChanged(SensorEvent event) {
float x, y, z = 0;
if (event.sensor.getType()==Sensor.TYPE_ACCELEROMETER) {
x=event.values[0];
y=event.values[1];
z=event.values[2];
tx.setText[B](Integer.toString(x)[/B]);
ty.setText([B]Integer.toString(y)[/B]);
tz.setText([B]Integer.toString(z)[/B]);
}
}
[user=439709]@override[/user]
public void onAccuracyChanged(Sensor arg0, int arg1) {
// TODO Auto-generated method stub
}
}
nikwen said:
It needs to be
Code:
tx.setText(String.valueOf(x));
ty.setText(String.valueOf(y));
tz.setText(String.valueOf(z));
If you pass an int, the TextView thinks that it is a resource id. That is why you need to convert it to a String first.
Click to expand...
Click to collapse
Yes! That did the trick! Now my next problem is that I only see one value instead of three, from there on I will try to move on by myself.
Sorry, I'm not sure if this is relevant, but you aren't overriding your onCreate method? Could that have anything to do with it?
MaartenXDA said:
Sorry, I'm not sure if this is relevant, but you aren't overriding your onCreate method? Could that have anything to do with it?
Click to expand...
Click to collapse
He does:
public void onCreate(Bundle savedInstanceState) {
Click to expand...
Click to collapse
He just did not wrote the @override annotation before that. As far as i know, you do not have to use it.
EDIT: Yep, it does not matter. See this: http://stackoverflow.com/questions/94361/when-do-you-use-javas-override-annotation-and-why
It says that it is just for ensuring that you are overriding the right method and for making the code easier to read.
Hi all, I am a bit further with my project since I found some time to work on it again.
//edit, force closes on starting fixed!
Here is what it is supposed to be doing: It reads the x, y and z values for acceleration from the LINEAR_ACCELERATION sensor. If a certain value is exceeded a timer will be started. If the amount of seconds the timer counts is higher than a defined threshold, it will play the default notifcation sound.
If the value from the sensor is below the threshold, it will stop the timer. The whole timer thing isn't working, the notification is played as soon as the normal acceleration threshold is passed and the time is ignored.
Please review my code below and tell me what I'm not seeing here, note that I'm still a noob.
Also I'm interested in a method to capture the maximum values read from the sensor and put it in a textview, can you help me?
AccelMeter.java:
Code:
package com.example.accelmeter;
import android.app.Activity;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.media.Ringtone;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.SystemClock;
import android.view.View;
import android.widget.Button;
import android.widget.Chronometer;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
public class AccelMeter extends Activity implements SensorEventListener {
private SensorManager sensorManager;
// Objekte deklarieren
TextView xC;
TextView yC;
TextView zC;
Chronometer chrono;
/* accThreshold = Schwellenwert in m/s² für die Beschleunigung
* accInterval = Zeitraum in Sekunden, über den der Wert für die Beschleunigung überwacht wird
*/
private float accThreshold = 50;
private float accInterval = 0;
[user=439709]@override[/user]
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_accel_meter);
// Achsen Objekte erstellen
xC=(TextView)findViewById(R.id.xCoordinate);
yC=(TextView)findViewById(R.id.yCoordinate);
zC=(TextView)findViewById(R.id.zCoordinate);
/* Sensor.TYPE_LINEAR_ACCELERATION = Beschleunigung auf jeder Achse ohne Gravitation in m/s²
* SENSOR_DELAY_FASTEST = schnellster Modus für Messung. Alternativen z.B. _GAME, _NORMAL oder _UI
*/
sensorManager=(SensorManager)getSystemService(SENSOR_SERVICE);
sensorManager.registerListener(this,
sensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION),
SensorManager.SENSOR_DELAY_NORMAL);
// Schwellenwert festlegen und mit einer Toast-Benachrichtigung bestätigen, Fehlerbehandlung wenn kein Wert eingegeben wurde
Button setThreshold = (Button)findViewById(R.id.setThreshold);
setThreshold.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
try {
EditText et = (EditText)findViewById(R.id.threshold);
accThreshold = Float.valueOf(et.getText().toString());
Toast.makeText(getApplicationContext(), "Neuer Schwellenwert festgelegt!", Toast.LENGTH_SHORT).show();
}
catch (Exception e) {
Toast.makeText(getApplicationContext(), "Es wurde noch kein Wert eingegeben!", Toast.LENGTH_SHORT).show();
}
}
});
// Intervall festlegen und mit einer Toast-Benachrichtigung bestätigen, Fehlerbehandlung wenn kein Wert eingegeben wurde
Button setInterval = (Button)findViewById(R.id.setInterval);
setInterval.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
try {
EditText et = (EditText)findViewById(R.id.editInterval);
accInterval = Float.valueOf(et.getText().toString());
Toast.makeText(getApplicationContext(), "Neues Intervall festgelegt!", Toast.LENGTH_SHORT).show();
}
catch (Exception e) {
Toast.makeText(getApplicationContext(), "Es wurde noch kein Wert eingegeben!", Toast.LENGTH_SHORT).show();
}
}
});
// Programm beenden
Button exit = (Button)findViewById(R.id.exit);
exit.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
finish();
System.exit(0);
}
});
}
public void onSensorChanged(SensorEvent event){
// Sensor Typ überprüfen
if(event.sensor.getType()==Sensor.TYPE_LINEAR_ACCELERATION){
// Richtungen verknüpfen
float x=event.values[0];
float y=event.values[1];
float z=event.values[2];
// Gerundete Ergebnisse mit vier Nachkommastellen ausgeben
xC.setText("X: "+(Math.abs(Math.round(x * 1000) / 1000.0)));
yC.setText("Y: "+(Math.abs(Math.round(y * 1000) / 1000.0)));
zC.setText("Z: "+(Math.abs(Math.round(z * 1000) / 1000.0)));
// Wenn Beschleunigung über Schwellenwert liegt, starte Timer. Wenn Timer das festgelete Intervall überschreitet, spiele Benachrichtigungston
if (x + y + z > accThreshold)
{
chrono = new Chronometer(this);
chrono.setBase(SystemClock.elapsedRealtime());
chrono.start();
long seconds = ((chrono.getBase()-SystemClock.elapsedRealtime()/1000%60));
if (seconds >= accInterval)
{
Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), notification);
r.play();
}
else
{
chrono.stop();
}
}
}
}
[user=439709]@override[/user]
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}
}
activity_accel_meter.xml:
Code:
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<TableRow tools:ignore="ExtraText" >
<TextView
android:id="@+id/xCoordinate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="X Koordinate: "
android:textAppearance="?android:attr/textAppearanceLarge"
tools:ignore="HardcodedText" />
/>
</TableRow>
<TableRow>
<TextView
android:id="@+id/yCoordinate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Y Koordinate: "
android:textAppearance="?android:attr/textAppearanceLarge"
tools:ignore="HardcodedText" />
/>
</TableRow>
<TableRow>
<TextView
android:id="@+id/zCoordinate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Z Koordinate: "
android:textAppearance="?android:attr/textAppearanceLarge"
tools:ignore="HardcodedText" />
/>
</TableRow>
<EditText
android:id="@+id/threshold"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="10"
android:hint="Schwellenwert (float)"
android:inputType="numberDecimal"
tools:ignore="HardcodedText" />
<Button
android:id="@+id/setThreshold"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Schwellenwert festlegen"
tools:ignore="HardcodedText" />
<EditText
android:id="@+id/editInterval"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="10"
android:hint="Zeit in Sekunden"
android:inputType="number"
tools:ignore="HardcodedText" >
<requestFocus />
</EditText>
<Button
android:id="@+id/setInterval"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Zeitraum für Überwachung festlegen"
tools:ignore="HardcodedText" />
<Button
android:id="@+id/exit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Beenden"
tools:ignore="HardcodedText" />
</TableLayout>
Yay German code (live there, too) xD Initialise your seconds in your onCreate, it's much nicer and probably the problem. A method gets the highest value the sensor measured would be a simple
Code:
double savedVal=0; //or any other type
private void updateMaxVal(){
double currentVal =// get the value from the specific sensor
if(savedVal<currentVal) {
savedVal = currentVal;
// maybe save the time as well
}
You'd have to put that method in the onsensorchanged so it will be called often. Then update your text View with the new saved value
SimplicityApks said:
Yay German code (live there, too) xD Initialise your seconds in your onCreate, it's much nicer and probably the problem. A method gets the highest value the sensor measured would be a simple
Code:
double savedVal=0; //or any other type
private void updateMaxVal(){
double currentVal =// get the value from the specific sensor
if(savedVal<currentVal) {
savedVal = currentVal;
// maybe save the time as well
}
You'd have to put that method in the onsensorchanged so it will be called often. Then update your text View with the new saved value
Click to expand...
Click to collapse
Hey fellow German!
If I initialise the seconds variable in the onCreate part it says that the variable is not being used (yellow marking) and in the code below I get an error obviously stating that the variable is unknown. ^^
I have three different values, how can I link the x, y and z variables in the method and how can I make sure the variables are known inside of the method? (Same problem as above)
Since I don't know how to do it with a method I just wrote the following code in my onsensorchanged part, the problem is that the max value textviews always show the same as the current value textviews:
float savedValX = 0;
float savedValY = 0;
float savedValZ = 0;
float currentValX = event.values[0];
float currentValY = event.values[1];
float currentValZ = event.values[2];
if (savedValX < currentValX) {
savedValX = currentValX;
xM.setText("X max: "+(Math.abs(Math.round(currentValX * 1000) / 1000.0)));
}
if (savedValY < currentValY) {
savedValY = currentValY;
yM.setText("Y max: "+(Math.abs(Math.round(currentValY * 1000) / 1000.0)));
}
if (savedValZ < currentValZ) {
savedValZ = currentValZ;
zM.setText("Z max: "+(Math.abs(Math.round(currentValZ * 1000) / 1000.0)));
}
Also I still have the problem that my seconds interval is being ignored.
//edit, fixed it! Now I only need the max value method.
OK so I now understand what you are trying to do with your Chronometer, the problem is that you reinitialize it every time the onSensorChanged is called so if you then ask for the seconds it has just started. To fix this, you could set an onChronometerTickListener and set your textViews in that method. To avoid recreating the Chrono use
Code:
if(chrono==null){
chrono = new Chronometer();
chrono.start();
}
If u don't want the tick listener or it doesn't work ( haven't used it yet) you can put your if(seconds<...)in the else {}of above method. But remember that the onSensorChanged is called EVERYTIME the sensor registers a change, this might be very often or just sometimes, so there is no guarantee that the text views will be updated if the else clause in that method is used
PS forget about the initializing of the seconds, I don't know what I was thinking yesterday, but I guess it was too late ...
/*edit:
What I meant with
Code:
double savedVal=0; //or any other type
private void updateMaxVal(){
is that you save your value in your class ("globally"), so that it is accessible to the whole class.
and to do it nicely you can do it like this:
Code:
float savedValX = 0;
float savedValY = 0;
float savedValZ = 0;
boolean change = false;
private void updateMaxVals(SensorEvent event){ // call this method in your onSensorChanged
change = false;
savedValX = getMax(event.values[0], savedValX);
if(change){
xM.setText("X max: "+(Math.abs(Math.round(savedValX * 1000) / 1000.0)));
}
savedValY = getMax(event.values[1], savedValY);
if(change){
yM.setText("Y max: "+(Math.abs(Math.round(savedValY * 1000) / 1000.0)));
}
savedValZ = getMax(event.values[2], savedValZ);
if(change){
yM.setText("Z max: "+(Math.abs(Math.round(savedValZ * 1000) / 1000.0)));
}
}
private float getMax(float currentVal, float savedVal){
if(currentVal > savedVal){
change = true;
return currentVal;
}else{
change = false;
return savedVal;
}
}
Im trying to start a simple app and i need to display on a SurfaceView the preview of the cam as soon as the App start.
i added the permission to the manifest:
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
and my code:
Code:
import android.content.Context;
import android.hardware.Camera;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class MainActivity extends SurfaceView implements SurfaceHolder.Callback{
SurfaceView mSurfaceView;
private SurfaceHolder mHolder;
public Camera camera = null;
public MainActivity(Context context) {
super(context);
mSurfaceView = (SurfaceView) findViewById(R.id.surfaceView);
mHolder = mSurfaceView.getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
[user=439709]@override[/user]
public void surfaceCreated(SurfaceHolder holder) {
camera = Camera.open();
try{
camera.setPreviewDisplay(mHolder);
} catch(Exception e){
}
}
[user=439709]@override[/user]
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
Camera.Parameters params = camera.getParameters();
params.setPreviewSize(width,height);
camera.setParameters(params);
camera.startPreview();
}
[user=439709]@override[/user]
public void surfaceDestroyed(SurfaceHolder holder) {
camera.stopPreview();
camera = null;
}
}
Ive looked for many tutorial and all technically do the same or smiliart stuff. But the app crashes. I cant find a solution
LogCat
Code:
06-01 12:39:12.456 616-841/system_process I/ActivityManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.example.droidcam/.MainActivity bnds=[240,408][240,408]} from pid 861
06-01 12:39:12.596 616-841/system_process D/dalvikvm: GC_FOR_ALLOC freed 1352K, 16% free 11518K/13560K, paused 112ms, total 118ms
06-01 12:39:12.636 2744-2744/? D/dalvikvm: Late-enabling CheckJNI
06-01 12:39:12.646 616-881/system_process I/ActivityManager: Start proc com.example.droidcam for activity com.example.droidcam/.MainActivity: pid=2744 uid=10019 gids={50019, 1006, 1028}
06-01 12:39:12.746 2744-2744/com.example.droidcam E/Trace: error opening trace file: No such file or directory (2)
06-01 12:39:12.826 2744-2744/com.example.droidcam D/dalvikvm: newInstance failed: no <init>()
06-01 12:39:12.836 2744-2744/com.example.droidcam D/AndroidRuntime: Shutting down VM
06-01 12:39:12.836 2744-2744/com.example.droidcam W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0x2b5d9930)
06-01 12:39:12.836 2744-2744/com.example.droidcam E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.droidcam/com.example.droidcam.MainActivity}: java.lang.InstantiationException: can't instantiate class com.example.droidcam.MainActivity; no empty constructor
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2223)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2357)
at android.app.ActivityThread.access$600(ActivityThread.java:153)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1247)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5226)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.InstantiationException: can't instantiate class com.example.droidcam.MainActivity; no empty constructor
at java.lang.Class.newInstanceImpl(Native Method)
at java.lang.Class.newInstance(Class.java:1319)
at android.app.Instrumentation.newActivity(Instrumentation.java:1054)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2214)
... 11 more
06-01 12:39:12.836 616-1341/system_process W/ActivityManager: Force finishing activity com.example.droidcam/.MainActivity
06-01 12:39:12.986 616-650/system_process D/dalvikvm: GC_FOR_ALLOC freed 1696K, 24% free 10472K/13772K, paused 76ms, total 77ms
06-01 12:39:13.387 616-647/system_process W/ActivityManager: Activity pause timeout for ActivityRecord{2bd8aff0 u0 com.example.droidcam/.MainActivity}
06-01 12:39:18.952 2744-2744/? I/Process: Sending signal. PID: 2744 SIG: 9
06-01 12:39:18.952 616-943/system_process I/ActivityManager: Process com.example.droidcam (pid 2744) has died.
06-01 12:39:19.002 616-616/system_process W/InputMethodManagerService: Window already focused, ignoring focus gain of: [email protected] attribute=null, token = [email protected]
Please put your code into code tags.
EDIT: Thanks.
and Post/check logcats.
just saying it crashes is too vague.
out of ideas said:
and Post/check logcats.
just saying it crashes is too vague.
Click to expand...
Click to collapse
On Eclipse i know how to show the windows of the LogCat, but cant really find it here on Android Studio.
Im a bit newby about this sorry, coming from PHP using just Notepad.
Guess i found it, added log cat
I saw some tutorial like this, im not sure why it doesnt start.
Is it for te onCreate method missing? but i saw that for other works anyway like this
Btw i've also triyed an other way, but stills give me errors. i could upload that one too, different logcat.
Hope one of the two could be solved
Code:
import android.app.Activity;
import android.hardware.Camera;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import java.io.IOException;
public class MainActivity extends Activity implements SurfaceHolder.Callback{
/* VARIABILI PRIVATE */
private SurfaceView mSurfaceView;
private SurfaceHolder mSurfaceHolder;
private Camera mCamera;
/** Called when the activity is first created. */
[user=439709]@override[/user]
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mSurfaceView = (SurfaceView)findViewById(R.id.surfaceView);
mSurfaceHolder = mSurfaceView.getHolder();
mSurfaceHolder.addCallback(this);
mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
[user=439709]@override[/user]
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
Camera.Parameters params = mCamera.getParameters();
params.setPreviewSize(arg2, arg3);
mCamera.setParameters(params);
try {
//lancio la preview
mCamera.setPreviewDisplay(arg0);
mCamera.startPreview();
} catch (IOException e) {
//gestione errore
}
}
[user=439709]@override[/user]
public void surfaceCreated(SurfaceHolder holder) {
mCamera = Camera.open();
}
[user=439709]@override[/user]
public void surfaceDestroyed(SurfaceHolder holder) {
mCamera.stopPreview();
mCamera.release();
}
logcat
Code:
06-01 13:32:31.187 616-661/system_process I/ActivityManager: Start proc com.android.vending for service com.android.vending/com.google.android.finsky.services.ContentSyncService: pid=25552 uid=10005 gids={50005, 3003, 1015, 1028}
06-01 13:32:31.227 25552-25552/com.android.vending E/Trace: error opening trace file: No such file or directory (2)
06-01 13:32:31.387 616-841/system_process I/ActivityManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.example.droidcam/.MainActivity bnds=[240,408][240,408]} from pid 861
06-01 13:32:31.437 25566-25566/? D/dalvikvm: Late-enabling CheckJNI
06-01 13:32:31.447 616-1341/system_process I/ActivityManager: Start proc com.example.droidcam for activity com.example.droidcam/.MainActivity: pid=25566 uid=10019 gids={50019, 1006, 1028}
06-01 13:32:31.607 25566-25566/com.example.droidcam E/Trace: error opening trace file: No such file or directory (2)
06-01 13:32:31.787 25552-25552/com.android.vending D/Finsky: [1] FinskyApp.onCreate: Initializing network with DFE https://android.clients.google.com/fdfe/
06-01 13:32:31.987 25552-25552/com.android.vending D/Finsky: [1] DailyHygiene.goMakeHygieneIfDirty: No need to run daily hygiene.
06-01 13:32:32.037 25552-25552/com.android.vending W/Settings: Setting download_manager_max_bytes_over_mobile has moved from android.provider.Settings.Secure to android.provider.Settings.Global.
06-01 13:32:32.037 25552-25552/com.android.vending W/Settings: Setting download_manager_recommended_max_bytes_over_mobile has moved from android.provider.Settings.Secure to android.provider.Settings.Global.
06-01 13:32:32.178 616-881/system_process D/dalvikvm: GC_FOR_ALLOC freed 656K, 26% free 11321K/15124K, paused 82ms, total 86ms
06-01 13:32:32.238 25566-25566/com.example.droidcam D/libEGL: loaded /system/lib/egl/libEGL_adreno200.so
06-01 13:32:32.258 25566-25566/com.example.droidcam D/libEGL: loaded /system/lib/egl/libGLESv1_CM_adreno200.so
06-01 13:32:32.258 25566-25566/com.example.droidcam D/libEGL: loaded /system/lib/egl/libGLESv2_adreno200.so
06-01 13:32:32.268 25566-25566/com.example.droidcam I/Adreno200-EGL: <qeglDrvAPI_eglInitialize:294>: EGL 1.4 QUALCOMM build: AU_LINUX_ANDROID_JB.04.01.01.00.036_msm8960_JB_CL2644550_release_AU (CL2644550)
Build Date: 07/31/12 Tue
Local Branch:
Remote Branch: quic/master
Local Patches: NONE
Reconstruct Branch: AU_LINUX_ANDROID_JB.04.01.01.00.036 + NOTHING
06-01 13:32:32.318 25566-25566/com.example.droidcam D/OpenGLRenderer: Enabling debug mode 0
06-01 13:32:32.348 256-515/? I/AwesomePlayer: setDataSource_l(URL suppressed)
06-01 13:32:32.378 256-25622/? D/MediaExtractor: returning default extractor
06-01 13:32:32.388 256-515/? I/AwesomePlayer: setDataSource_l(URL suppressed)
06-01 13:32:32.408 256-25626/? D/MediaExtractor: returning default extractor
06-01 13:32:32.408 256-515/? I/CameraClient: Opening camera 0
06-01 13:32:32.408 256-515/? W/ServiceManager: Permission failure: com.sonyericsson.permission.CAMERA_EXTENDED from uid=10019 pid=25566
06-01 13:32:32.438 256-25630/? I/caladbolg: 3348999538 cald_camctrl.c (6713) 25630 P [SVR] -945967758 + Cald_CamCtrl_PowerUp
06-01 13:32:32.438 256-25630/? I/caladbolg: 3348999630 cald_camctrl.c (7484) 25630 P [SVR] -945967666 + Cald_CamCtrl_FSM_Func_PowerUp
06-01 13:32:32.438 256-25630/? I/caladbolg: 3349003170 cald_hal_qct.c (2789) 25630 P [HAL] -945964126 + Cald_Hal_Qct_If_PowerUp
06-01 13:32:32.438 256-25630/? I/caladbolg: 3349003323 cald_hal_qct.c (2847) 25630 P [HAL] -945963973 - Cald_Hal_Qct_If_PowerUp (0)
06-01 13:32:32.438 256-25630/? I/caladbolg: 3349004665 cald_camctrl.c (7563) 25630 P [SVR] -945962631 - Cald_CamCtrl_FSM_Func_PowerUp (0)
06-01 13:32:32.438 256-25630/? I/caladbolg: 3349004726 cald_camctrl.c (6720) 25630 P [SVR] -945962570 - Cald_CamCtrl_PowerUp (0)
06-01 13:32:32.448 256-25630/? E/caladbolg: 3349014431 cald_camctrl.c (11888) 25630 E [SVR] PreviewSize Invalid param: value[402x527]
06-01 13:32:32.458 25566-25566/com.example.droidcam D/AndroidRuntime: Shutting down VM
06-01 13:32:32.458 25566-25566/com.example.droidcam W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0x2b5d9930)
06-01 13:32:32.488 25566-25566/com.example.droidcam E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.RuntimeException: setParameters failed
at android.hardware.Camera.native_setParameters(Native Method)
at android.hardware.Camera.setParameters(Camera.java:1496)
at com.example.droidcam.MainActivity.surfaceChanged(MainActivity.java:41)
at android.view.SurfaceView.updateWindow(SurfaceView.java:580)
at android.view.SurfaceView.access$000(SurfaceView.java:86)
at android.view.SurfaceView$3.onPreDraw(SurfaceView.java:174)
at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:680)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1842)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:989)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4351)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
at android.view.Choreographer.doCallbacks(Choreographer.java:562)
at android.view.Choreographer.doFrame(Choreographer.java:532)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
at android.os.Handler.handleCallback(Handler.java:725)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5226)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
at dalvik.system.NativeStart.main(Native Method)
06-01 13:32:32.498 616-943/system_process W/ActivityManager: Force finishing activity com.example.droidcam/.MainActivity
06-01 13:32:32.688 25552-25552/com.android.vending D/Finsky: [1] 2.run: Loaded library for account: [i1YaFxIWaZrcOQ26zxNX5K0RvvY]
06-01 13:32:32.688 25552-25552/com.android.vending D/Finsky: [1] 2.run: Finished loading 1 libraries.
06-01 13:32:32.908 25552-25552/com.android.vending D/Finsky: [1] 5.onFinished: Installation state replication succeeded.
06-01 13:32:33.018 616-647/system_process W/ActivityManager: Activity pause timeout for ActivityRecord{2b946870 u0 com.example.droidcam/.MainActivity}
In Android you normally do not use the constructor of an Activity for anything.
Use the onCreate method instead.
EDIT: The log says that the constructor must be empty.
nikwen said:
In Android you normally do not use the constructor of an Activity for anything.
Use the onCreate method instead.
EDIT: The log says that the constructor must be empty.
Click to expand...
Click to collapse
I thought about that (even if i saw video tutorial doing it) so i tried wht onCreate method and now it seams to give problem with the setParameters?
Ive uploaded the new code and logcats before
Ah. Check this: http://stackoverflow.com/questions/3890381/camera-setparameters-failed-in-android
nikwen said:
Ah. Check this: http://stackoverflow.com/questions/3890381/camera-setparameters-failed-in-android
Click to expand...
Click to collapse
i tryed that at th beggin, and didnt work, in fact i tried it again and still give me the same error apparently
While I'm still learning myself, it looks like you are getting a failed camera permission. And then it tries to pass in an invalid parameter to the camera.
deniel said:
I/CameraClient: Opening camera 0
06-01 13:32:32.408 256-515/? W/ServiceManager: Permission failure: com.sonyericsson.permission.CAMERA_EXTENDED from uid=10019 pid=25566
06-01 13:32:32.448 256-25630/? E/caladbolg: 3349014431 cald_camctrl.c (11888) 25630 E [SVR] PreviewSize Invalid param: value[402x527]
[/CODE]
Click to expand...
Click to collapse
Sent from a Toasted Devil
netwokz said:
While I'm still learning myself, it looks like you are getting a failed camera permission. And then it tries to pass in an invalid parameter to the camera.
Sent from a Toasted Devil
Click to expand...
Click to collapse
But cant understand which one and how should i do. it ryed the 2 ways everybody does
What phone are you trying this on? Have you tried it in an emulator?
After getting home and I was able to try your second piece of code. It looks like it is a problem with <CODE>params.setPreviewSize(arg2, arg3);</CODE>, it doesn't like the width and height arguments. I found THIS(second answer). and after plugging it into your code it was working for me. If you like I can show you the modified code, altho its real easy to plug in.
netwokz said:
After getting home and I was able to try your second piece of code. It looks like it is a problem with <CODE>params.setPreviewSize(arg2, arg3);</CODE>, it doesn't like the width and height arguments. I found THIS(second answer). and after plugging it into your code it was working for me. If you like I can show you the modified code, altho its real easy to plug in.
Click to expand...
Click to collapse
i tryed his first example and finally i get his "distoted" image. When i'll have time ill try the rets thnk u very much
ill try this:
Code:
Camera.Size getBestPreviewSize(int width, int height, Camera.Parameters parameters) {
Camera.Size result=null;
float dr = Float.MAX_VALUE;
float ratio = (float)width/(float)height;
for (Camera.Size size : parameters.getSupportedPreviewSizes()) {
float r = (float)size.width/(float)size.height;
if( Math.abs(r - ratio) < dr && size.width <= width && size.height <= height ) {
dr = Math.abs(r - ratio);
result = size;
}
}
return result;
}
Code:
ublic void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
// Now that the size is known, set up the camera parameters and begin
// the preview.
if (isPreviewRunning) {
mCamera.stopPreview();
}
Camera.Parameters parameters = mCamera.getParameters();
List<Size> sizes = parameters.getSupportedPreviewSizes();
Size optimalSize = getBestPreviewSize( w, h, parameters);
parameters.setPreviewSize(optimalSize.width, optimalSize.height);
mCamera.setParameters(parameters);
mCamera.startPreview();
isPreviewRunning =true;
}
im not sure abot the 3rd parameter of the getBestPreviewSize method which one is it. Like this is still distorted
Yeah, I could never fix the distortion back when I was trying my camera app. But I think I will tinker with it again. Keep this updated if you find anything, I will also.
Sent from a Toasted Devil
Hello everyone, me again.
I am having a little issue with my android app.
When I run the service on the phone, it starts just fine and when the call is disconnected it throws an java.lang.NullPointerException when i start the tareaEnviarABD.execute(); task.
This is the code of my service:
Code:
package com.trucka.llamadasdrivers;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.PropertyInfo;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.IBinder;
import android.provider.CallLog;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;
public class ServicioLlamadas extends Service {
TextView txtInformacion = null;
TextView txtDetalles = null;
TextView tv = null;
private String resultado;
String phNumber = null;
String callType = null;
String callDate = null;
DateFormat shortFecha = null;
DateFormat shortDF = null;
Date callDayTime = null;
Date fin = null;
String fechaLlamada1 = null;
String fechaLlamada2 = null;
String callDuration = null;
String dir = null;
public String tolo = null;
String imei = null;
String comentario = null;
String fechaRegistro = null;
String insercion = null;
String fechaInicio = null;
String fechaFin = null;
String estadoLlamada = null;
private static ServicioLlamadas instance = null;
public static boolean isRunning() {
return instance != null;
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
Toast.makeText(getApplicationContext(), "Servicio TRUCKA creado",
Toast.LENGTH_SHORT).show();
instance = this;
}
@Override
public void onDestroy() {
Toast.makeText(getApplicationContext(), "Servicio TRUCKA destruído",
Toast.LENGTH_SHORT).show();
instance = null;
}
@Override
public void onStart(Intent intent, int startid) {
Toast.makeText(getApplicationContext(), "Servicio TRUCKA iniciado",
Toast.LENGTH_SHORT).show();
TelephonyManager TelephonyMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
TelephonyMgr.listen(new TeleListener(),
PhoneStateListener.LISTEN_CALL_STATE);
}
class TeleListener extends PhoneStateListener {
@Override
public void onCallStateChanged(int state, String incomingNumber) {
super.onCallStateChanged(state, incomingNumber);
switch (state) {
case TelephonyManager.CALL_STATE_IDLE:
if (estadoLlamada == "OFFHOOK") {
insercion = null;
getCallDetails();
Toast.makeText(getApplicationContext(),
"Información enviada.", Toast.LENGTH_SHORT).show();
}
estadoLlamada = "IDLE";
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
estadoLlamada = "OFFHOOK";
Toast.makeText(getApplicationContext(),
"Enviando información...", Toast.LENGTH_SHORT).show();
break;
case TelephonyManager.CALL_STATE_RINGING:
break;
default:
break;
}
}
}
//Obtener la fecha actual del teléfono.
public long getTodayTimestamp() {
Calendar c1 = Calendar.getInstance();
c1.setTime(new Date());
Calendar c2 = Calendar.getInstance();
c2.set(Calendar.YEAR, c1.get(Calendar.YEAR));
c2.set(Calendar.MONTH, c1.get(Calendar.MONTH));
c2.set(Calendar.DAY_OF_MONTH, c1.get(Calendar.DAY_OF_MONTH));
c2.set(Calendar.HOUR_OF_DAY, 0);
c2.set(Calendar.MINUTE, 0);
c2.set(Calendar.SECOND, 0);
return c2.getTimeInMillis();
}
private void getCallDetails() {
String timestamp = String.valueOf(getTodayTimestamp());
StringBuffer sb = new StringBuffer();
Cursor managedCursor = getContentResolver().query(CallLog.Calls.CONTENT_URI, null,
CallLog.Calls.DATE + ">= ?", new String[] { timestamp }, null);
int number = managedCursor.getColumnIndex(CallLog.Calls.NUMBER);
int type = managedCursor.getColumnIndex(CallLog.Calls.TYPE);
int date = managedCursor.getColumnIndex(CallLog.Calls.DATE);
int duration = managedCursor.getColumnIndex(CallLog.Calls.DURATION);
sb.append("Bitácora de llamadas :");
//managedCursor.moveToFirst();
managedCursor.moveToLast();
phNumber = managedCursor.getString(number);
callType = managedCursor.getString(type);
callDate = managedCursor.getString(date);
shortFecha = DateFormat.getDateInstance(DateFormat.SHORT);
shortDF = DateFormat.getTimeInstance(DateFormat.SHORT);
callDayTime = new Date(Long.valueOf(callDate));
fechaLlamada1 = shortDF.format(callDayTime);
fechaLlamada2 = shortFecha.format(callDayTime);
callDuration = managedCursor.getString(duration);
int dircode = Integer.parseInt(callType);
TelephonyManager mngr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
switch (dircode) {
case CallLog.Calls.OUTGOING_TYPE:
dir = "Saliente";
break;
case CallLog.Calls.INCOMING_TYPE:
dir = "Entrante";
break;
case CallLog.Calls.MISSED_TYPE:
dir = "Perdida";
break;
}
imei = mngr.getDeviceId();
comentario = dir;
fechaRegistro = fechaLlamada2;
DateFormat df = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss");
String ahorita = df.format(callDayTime);
fechaInicio = ahorita.toString();
insercion = "DECLARE @claveDriver INT, @nombreDriver VARCHAR(max), @evento VARCHAR(max), @duracion int, @inicial varchar(max) "
+ "SET @claveDriver = (SELECT cve_tra FROM SISTEMA.dbo.TELEFONOS WHERE IMEI_SIM = '"
+ mngr.getDeviceId()
+ "') "
+ "SET @nombreDriver = (SELECT nombre FROM SISTEMA.dbo.TELEFONOS WHERE IMEI_SIM = '"
+ mngr.getDeviceId()
+ "') "
+ "SET @duracion = "
+ managedCursor.getString(duration)
+ "SET @evento = '(LOG) Llamada "
+ dir
+ ". Duración ' + CONVERT(varchar, @duracion, 103) + ' segundos al número: "
+ managedCursor.getString(number)
+ "' "
+ " SET @inicial = '"
+ fechaInicio
+ "'"
+ "INSERT INTO bitacora.dbo.registroDellamadasOperadores (fechacreacion,fecha_fin,fecha_inicio,idMobil,Tractor,Nom_tra,Cve_tra,FechaRegistro,Evento) "
+ " VALUES('"
+ fechaInicio
+ "', DATEADD(SECOND,@duracion,@inicial),'"
+ fechaInicio
+ "','"
+ mngr.getDeviceId()
+ "','',@nombreDriver,@claveDriver,current_timestamp,@evento)";
try
{
AsyncCallWS tareaEnviarABD = new AsyncCallWS();
tareaEnviarABD.execute();
}catch(Exception e){
Toast.makeText(getApplicationContext(),
e.toString(), Toast.LENGTH_SHORT).show();
}
}
private class AsyncCallWS extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
Log.i(TAG, "doInBackground");
InsertarLlamada(insercion);
return null;
}
@Override
protected void onPostExecute(Void result) {
Log.i(TAG, "onPostExecute");
txtInformacion.setText("Información enviada");
}
@Override
protected void onPreExecute() {
Log.i(TAG, "onPreExecute");
txtInformacion.setText("Enviando información...");
}
@Override
protected void onProgressUpdate(Void... values) {
Log.i(TAG, "onProgressUpdate");
}
}
public void InsertarLlamada(String insercion) {
// Creamos la solicitud
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
// Propiedades que contienen los valores
PropertyInfo propiedades = new PropertyInfo();
propiedades.setName("insercion");
propiedades.setValue(insercion);
propiedades.setType(String.class);
// Agregamos las propiedades
request.addProperty(propiedades);
// Creamos el envelope
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
SoapEnvelope.VER11);
envelope.dotNet = true;
// ponemos la salida SOAP
envelope.setOutputSoapObject(request);
// Creamos la llamada HTTP
HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
try {
// Invocamos el servicio
androidHttpTransport.call(SOAP_ACTION, envelope);
// Obtenemos la respuesta
Object response = envelope.getResponse();
// Asignamos el resultado de la consulta
resultado = response.toString();
} catch (Exception e) {
Toast.makeText(getApplicationContext(),
e.toString(), Toast.LENGTH_SHORT).show();
}
}
}
And the log cat shows this:
Code:
02-25 09:32:32.946: D/ActivityThread(8866): setTargetHeapUtilization:0.25
02-25 09:32:32.946: D/ActivityThread(8866): setTargetHeapIdealFree:8388608
02-25 09:32:32.946: D/ActivityThread(8866): setTargetHeapConcurrentStart:2097152
02-25 09:33:07.663: D/libEGL(8866): loaded /system/lib/egl/libEGL_adreno200.so
02-25 09:33:07.663: D/libEGL(8866): loaded /system/lib/egl/libGLESv1_CM_adreno200.so
02-25 09:33:07.663: D/libEGL(8866): loaded /system/lib/egl/libGLESv2_adreno200.so
02-25 09:33:07.683: I/Adreno200-EGLSUB(8866): <ConfigWindowMatch:2087>: Format RGBA_8888.
02-25 09:33:07.693: E/(8866): <s3dReadConfigFile:75>: Can't open file for reading
02-25 09:33:07.693: E/(8866): <s3dReadConfigFile:75>: Can't open file for reading
02-25 09:33:07.693: D/OpenGLRenderer(8866): Enabling debug mode 0
02-25 09:33:13.128: I/TRUCKA_DRIVERS(8866): onPreExecute
02-25 09:33:13.128: D/AndroidRuntime(8866): Shutting down VM
02-25 09:33:13.128: W/dalvikvm(8866): threadid=1: thread exiting with uncaught exception (group=0x41e48438)
02-25 09:33:13.128: E/AndroidRuntime(8866): FATAL EXCEPTION: main
02-25 09:33:13.128: E/AndroidRuntime(8866): java.lang.NullPointerException
02-25 09:33:13.128: E/AndroidRuntime(8866): at com.trucka.llamadasdrivers.ServicioLlamadas$AsyncCallWS.onPreExecute(ServicioLlamadas.java:239)
02-25 09:33:13.128: E/AndroidRuntime(8866): at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:586)
02-25 09:33:13.128: E/AndroidRuntime(8866): at android.os.AsyncTask.execute(AsyncTask.java:534)
02-25 09:33:13.128: E/AndroidRuntime(8866): at com.trucka.llamadasdrivers.ServicioLlamadas.getCallDetails(ServicioLlamadas.java:215)
02-25 09:33:13.128: E/AndroidRuntime(8866): at com.trucka.llamadasdrivers.ServicioLlamadas.access$0(ServicioLlamadas.java:143)
02-25 09:33:13.128: E/AndroidRuntime(8866): at com.trucka.llamadasdrivers.ServicioLlamadas$TeleListener.onCallStateChanged(ServicioLlamadas.java:108)
02-25 09:33:13.128: E/AndroidRuntime(8866): at android.telephony.PhoneStateListener$2.handleMessage(PhoneStateListener.java:421)
02-25 09:33:13.128: E/AndroidRuntime(8866): at android.os.Handler.dispatchMessage(Handler.java:99)
02-25 09:33:13.128: E/AndroidRuntime(8866): at android.os.Looper.loop(Looper.java:137)
02-25 09:33:13.128: E/AndroidRuntime(8866): at android.app.ActivityThread.main(ActivityThread.java:5062)
02-25 09:33:13.128: E/AndroidRuntime(8866): at java.lang.reflect.Method.invokeNative(Native Method)
02-25 09:33:13.128: E/AndroidRuntime(8866): at java.lang.reflect.Method.invoke(Method.java:511)
02-25 09:33:13.128: E/AndroidRuntime(8866): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
02-25 09:33:13.128: E/AndroidRuntime(8866): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:558)
02-25 09:33:13.128: E/AndroidRuntime(8866): at dalvik.system.NativeStart.main(Native Method)
02-25 09:33:14.240: I/Process(8866): Sending signal. PID: 8866 SIG: 9
Can someone please tell me what am I doing wrong?
Thanks!
FedePrado said:
Hello everyone, me again.
Code:
@Override
protected void onPreExecute() {
Log.i(TAG, "onPreExecute");
txtInformacion.setText("Enviando información...");
}
02-25 09:33:13.128: E/AndroidRuntime(8866): java.lang.NullPointerException
02-25 09:33:13.128: E/AndroidRuntime(8866): at com.trucka.llamadasdrivers.ServicioLlamadas$AsyncCallWS.onPreExecute(ServicioLlamadas.java:239)
Click to expand...
Click to collapse
it tells you there, note that on line 239 you are asking an object (in this case "txtInfromacion") to execute one of it's methods, but the object is actually "null" so it throws the exception
disclaimer, I only looked at it for 10 seconds cause busy but I would think there is a 99.5% chance I'm correct
EDIT : ok looked at it another 5 seconds, you never assign anything to that TextView, like associating it with the view on screen ? eg. findViewById(R.id.someID)
Hello, i use ION to talk to my Server and send Data with JSON over POST. And I recieve a JSON.
That is my Code.
Code:
package com.androidstudio.myapplication3.app;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import com.koushikdutta.async.future.FutureCallback;
import com.koushikdutta.ion.Ion;
import org.json.JSONObject;
import org.json.JSONException;
public class MainActivity extends Activity {
String games_n;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
JSONObject json = new JSONObject();
try {
json.put("nick", "Johannes");
} catch (JSONException e) {
e.printStackTrace();
}
try {
Ion.with(getApplicationContext())
.load("http://example.com/post")
.setJsonObjectBody(json)
.asJsonObject()
.setCallback(new FutureCallback<JSONObject>() {
@Override
public void onCompleted(Exception f, JSONObject result) {
try {
games_n = result.optString("games_up");
} catch(Exception e) {
e.printStackTrace();
}
}
});
} catch (Exception IO) {
IO.getCause();
}
}
and that is the error i get:
Code:
error: cannot access TypeToken
class file for com.google.gson.reflect.TypeToken not found
I also make a picture of the wrong Part. Please help me thx.
https://github.com/koush/ion
I changed my code to:
Code:
JsonObject json = new JsonObject();
json.addProperty("nick", nick);
Ion.with(getApplicationContext())
.load("*****")
.setJsonObjectBody(json)
.asJsonObject()
.setCallback(new FutureCallback<JsonObject>() {
@Override
public void onCompleted(Exception e, JsonObject result) {
try {
JsonArray personen = result.getAsJsonArray("user");
for (int i = 0; i < personen.size(); i++) {
JsonObject user = personen.get(i).getAsJsonObject();
mTest.setText(user.get("games_up").getAsString());
}
} catch (Exception f) {
f.printStackTrace();
}
}
});
Now there is no Error in Android Studio, but the App stops when i execute it...
Any error logs? Or is the data too huge and needs to be ran on asynctask? You need to provide an example data from your server.
frenzyboi said:
Any error logs? Or is the data too huge and needs to be ran on asynctask? You need to provide an example data from your server.
Click to expand...
Click to collapse
Ok, the php file is: (I make $nick to Johannes normaly i read this out of the POST Methode.
PHP:
<?php
/*$json = $_SERVER['HTTP_JSON'];
var_dump($json);
$data = json_decode($json);
var_dump($data);
$nick = $data->nick;*/
$nick = 'Johannes';
include 'db_connect.php';
$sql = mysql_query('SELECT * FROM user WHERE nick = "'.$nick.'"') or die(mysql_error());
while ($zeile = mysql_fetch_array($sql)) {
$id = $zeile["id"];
$games = $zeile["games"];
$games_up = $zeile["games_up"];
$coins = $zeile["coins"];
}
$user = array();
$user = NULL;
$user["games"] = $games;
$user["games_up"] = $games_up;
$user["coins"] = $coins;
echo json_encode(array('user'=>$user));
?>
That is an example for the JSON what is recieved:
HTML:
{"user":{"games":"","games_up":"14,","coins":"1500"}}
And that is the code I actually have, there is no error message in AndroidStudio and the App starts and Don't crash, but there is also no data...
Code:
package com.androidstudio.myapplication2.app;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.koushikdutta.async.future.FutureCallback;
import com.koushikdutta.ion.Ion;
public class games extends Activity {
private TextView mTest;
@Override
public void onCreate(Bundle saveInstanceState) {
mTest = (TextView)findViewById(R.id.test2);
super.onCreate(saveInstanceState);
setContentView(R.layout.games);
JsonObject json = new JsonObject();
json.addProperty("nick", "Johannes");
Log.e("nick", "johannes");
Ion.with(getApplicationContext())
.load("http://kulturverein-mgh.de/test/get_user.php")
.setJsonObjectBody(json)
.asJsonObject()
.setCallback(new FutureCallback<JsonObject>() {
@Override
public void onCompleted(Exception e, JsonObject result) {
try {
JsonArray personen = result.getAsJsonArray("Spiel");
for (int i = 0; i < personen.size(); i++) {
Log.e("hallo", "as");
JsonObject user = personen.get(i).getAsJsonObject();
mTest.setText(user.get("frage1").getAsString());
}
} catch (Exception f) {
f.printStackTrace();
}
}
});
}
}
This is the LOG:
05-13 06:30:08.277 16105-16105/com.androidstudio.myapplication2.app W/InputMethodManager﹕ Bind error! start to finishInputLocked and closeCurrentInput
05-13 06:30:08.277 16105-16105/com.androidstudio.myapplication2.app W/InputMethodManager﹕ Bind error! end to finishInputLocked and closeCurrentInput
05-13 06:30:14.007 16357-16357/com.androidstudio.myapplication2.app I/Adreno-EGL﹕ <qeglDrvAPI_eglInitialize:320>: EGL 1.4 QUALCOMM Build: I0404c4692afb8623f95c43aeb6d5e13ed4b30ddbDate: 11/06/13
05-13 06:30:14.027 16357-16357/com.androidstudio.myapplication2.app D/OpenGLRenderer﹕ Enabling debug mode 0
05-13 06:30:17.227 16357-16357/com.androidstudio.myapplication2.app E/nick﹕ johannes
05-13 06:30:17.447 16357-16357/com.androidstudio.myapplication2.app W/System.err﹕ java.lang.NullPointerException
05-13 06:30:17.447 16357-16357/com.androidstudio.myapplication2.app W/System.err﹕ at com.androidstudio.myapplication2.app.games$1.onCompleted(games.java:38)
05-13 06:30:17.447 16357-16357/com.androidstudio.myapplication2.app W/System.err﹕ at com.androidstudio.myapplication2.app.games$1.onCompleted(games.java:33)
05-13 06:30:17.447 16357-16357/com.androidstudio.myapplication2.app W/System.err﹕ at com.koushikdutta.async.future.SimpleFuture.handleCallbackUnlocked(SimpleFuture.java:82)
05-13 06:30:17.447 16357-16357/com.androidstudio.myapplication2.app W/System.err﹕ at com.koushikdutta.async.future.SimpleFuture.setComplete(SimpleFuture.java:118)
05-13 06:30:17.447 16357-16357/com.androidstudio.myapplication2.app W/System.err﹕ at com.koushikdutta.async.future.SimpleFuture.setComplete(SimpleFuture.java:105)
05-13 06:30:17.447 16357-16357/com.androidstudio.myapplication2.app W/System.err﹕ at com.koushikdutta.ion.IonRequestBuilder$1.run(IonRequestBuilder.java:252)
05-13 06:30:17.447 16357-16357/com.androidstudio.myapplication2.app W/System.err﹕ at com.koushikdutta.async.AsyncServer$RunnableWrapper.run(AsyncServer.java:52)
05-13 06:30:17.447 16357-16357/com.androidstudio.myapplication2.app W/System.err﹕ at android.os.Handler.handleCallback(Handler.java:733)
05-13 06:30:17.447 16357-16357/com.androidstudio.myapplication2.app W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:95)
05-13 06:30:17.447 16357-16357/com.androidstudio.myapplication2.app W/System.err﹕ at android.os.Looper.loop(Looper.java:136)
05-13 06:30:17.447 16357-16357/com.androidstudio.myapplication2.app W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:5017)
05-13 06:30:17.447 16357-16357/com.androidstudio.myapplication2.app W/System.err﹕ at java.lang.reflect.Method.invokeNative(Native Method)
05-13 06:30:17.447 16357-16357/com.androidstudio.myapplication2.app W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:515)
05-13 06:30:17.447 16357-16357/com.androidstudio.myapplication2.app W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:798)
05-13 06:30:17.447 16357-16357/com.androidstudio.myapplication2.app W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:614)
05-13 06:30:17.447 16357-16357/com.androidstudio.myapplication2.app W/System.err﹕ at miui.dexspy.DexspyInstaller.main(DexspyInstaller.java:171)
05-13 06:30:17.447 16357-16357/com.androidstudio.myapplication2.app W/System.err﹕ at dalvik.system.NativeStart.main(Native Method)
Click to expand...
Click to collapse
Hi! I am trying to create an Android app which sends a message through Bluetooth from a device to another device. I am beginner in Android programming, so I have found a source code, which should do this. The problem is, that somehow I can't connect the 2 devices. I wrote this problem to some Android forums, but nobody could give me a satisfying answer. Please help me, Any answer would be appreciated which helps me to solve this problem.
Source code:
MainActivity.java:
Code:
package com.example.proba2x8;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Set;
import java.util.UUID;
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends Activity {
//@Override
//protected void onCreate(Bundle savedInstanceState) {
// super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_main);
//}
//}
//public class MainActivity extends ActionBarActivity {
BluetoothAdapter mBluetoothAdapter;
BluetoothSocket mmSocket;
BluetoothDevice mmDevice;
OutputStream mmOutputStream;
InputStream mmInputStream;
Thread workerThread;
EditText myTextbox;
TextView myLabel;
byte[] readBuffer;
int readBufferPosition;
int counter;
volatile boolean stopWorker;
String address;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent discoverableIntent = new
Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
startActivity(discoverableIntent);
try {
Button sendButton = (Button) findViewById(R.id.send);
Button openButton = (Button) findViewById(R.id.open);
Button findButton = (Button) findViewById(R.id.bFind);
myTextbox = (EditText) findViewById(R.id.editText);
myLabel = (TextView) findViewById(R.id.textView);
openButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
openBT();
} catch (IOException ex) {
}
}
});
// send data typed by the user to be printed
sendButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
try {
sendData();
} catch (IOException ex) {
}
}
});
findButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
findBT();
}
});
} catch (NullPointerException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
// This will find a bluetooth device
void findBT() {
try {
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (mBluetoothAdapter == null) {
myLabel.setText("No bluetooth adapter available");
}
if (!mBluetoothAdapter.isEnabled()) {
Intent enableBluetooth = new Intent(
BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBluetooth, 0);
}
Set<BluetoothDevice> pairedDevices = mBluetoothAdapter
.getBondedDevices();
if (pairedDevices.size() > 0) {
for (BluetoothDevice device : pairedDevices) {
// Salaxy S4 is the name of the bluetooth device
if (device.getName().equals("Xperia mini pro")) {
mmDevice = device;
address = device.getAddress();
break;
}
}
}
myLabel.setText("Bluetooth Device Found," + address);
} catch (NullPointerException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
// Tries to open a connection to the bluetooth device
void openBT() throws IOException {
try {
// Standard SerialPortService ID
UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb");
mmSocket = mmDevice.createRfcommSocketToServiceRecord(uuid);
mmSocket.connect();
myLabel.setText("1");
mmOutputStream = mmSocket.getOutputStream();
mmInputStream = mmSocket.getInputStream();
beginListenForData();
myLabel.setText("Bluetooth Opened");
} catch (NullPointerException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
// After opening a connection to bluetooth device,
// we have to listen and check if a data were sent to be printed.
void beginListenForData() {
try {
final Handler handler = new Handler();
// This is the ASCII code for a newline character
final byte delimiter = 10;
stopWorker = false;
readBufferPosition = 0;
readBuffer = new byte[1024];
workerThread = new Thread(new Runnable() {
public void run() {
while (!Thread.currentThread().isInterrupted()
&& !stopWorker) {
try {
int bytesAvailable = mmInputStream.available();
if (bytesAvailable > 0) {
byte[] packetBytes = new byte[bytesAvailable];
mmInputStream.read(packetBytes);
for (int i = 0; i < bytesAvailable; i++) {
byte b = packetBytes[i];
if (b == delimiter) {
byte[] encodedBytes = new byte[readBufferPosition];
System.arraycopy(readBuffer, 0,
encodedBytes, 0,
encodedBytes.length);
final String data = new String(
encodedBytes, "US-ASCII");
readBufferPosition = 0;
handler.post(new Runnable() {
public void run() {
myLabel.setText(data);
}
});
} else {
readBuffer[readBufferPosition++] = b;
}
}
}
} catch (IOException ex) {
stopWorker = true;
}
}
}
});
workerThread.start();
} catch (NullPointerException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
/*
* This will send data to be printed by the bluetooth
*/
void sendData() throws IOException {
try {
// the text typed by the user
String msg = myTextbox.getText().toString();
msg += "\n";
Log.w("MainActivity", msg);
mmOutputStream.write(msg.getBytes());
// tell the user data were sent
myLabel.setText("Data Sent");
} catch (NullPointerException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
activity_main.xml:
Code:
<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="${relativePackage}.${activityClass}" >
<LinearLayout
android:id="@+id/linearLayout1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:orientation="vertical" >
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Enter Text Here" />
<EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10" >
<requestFocus />
</EditText>
</LinearLayout>
<Button
android:id="@+id/open"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/send"
android:layout_alignBottom="@+id/send"
android:layout_alignRight="@+id/linearLayout1"
android:text="Open" />
<Button
android:id="@+id/send"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/linearLayout1"
android:layout_marginTop="15dp"
android:text="Send" />
<TextView
android:id="@+id/recievedText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/send"
android:layout_below="@+id/send"
android:layout_marginTop="20dp"
android:text="Received Text" />
<TextView
android:id="@+id/rtArea"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/recievedText"
android:layout_alignParentBottom="true"
android:layout_below="@+id/recievedText"
android:layout_marginTop="20dp"
android:text="Received Text Will be Displayed Here..." />
<Button
android:id="@+id/bFind"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/open"
android:layout_centerHorizontal="true"
android:text="Find" />
</RelativeLayout>
LogCat errors:
Code:
12-04 03:08:27.452: E/BluetoothEventLoop.cpp(1184): event_filter: Received signal org.bluez.Device:PropertyChanged from /org/bluez/2002/hci0/dev_90_C1_15_37_AB_E7
12-04 03:08:27.732: W/System.err(1978): java.io.IOException: Service discovery failed
12-04 03:08:27.732: W/System.err(1978): at android.bluetooth.BluetoothSocket$SdpHelper.doSdp(BluetoothSocket.java:377)
12-04 03:08:27.742: W/System.err(1978): at android.bluetooth.BluetoothSocket.connect(BluetoothSocket.java:201)
12-04 03:08:27.742: W/System.err(1978): at com.example.proba2x8.MainActivity.openBT(MainActivity.java:147)
12-04 03:08:27.742: W/System.err(1978): at com.example.proba2x8.MainActivity$1.onClick(MainActivity.java:74)
12-04 03:08:27.742: W/System.err(1978): at android.view.View.performClick(View.java:2418)
12-04 03:08:27.742: W/System.err(1978): at android.view.View.onTouchEvent(View.java:4233)
12-04 03:08:27.742: W/System.err(1978): at android.widget.TextView.onTouchEvent(TextView.java:6645)
12-04 03:08:27.742: W/System.err(1978): at android.view.View.dispatchTouchEvent(View.java:3763)
12-04 03:08:27.742: W/System.err(1978): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:968)
12-04 03:08:27.742: W/System.err(1978): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:968)
12-04 03:08:27.742: W/System.err(1978): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:968)
12-04 03:08:27.752: W/System.err(1978): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1659)
12-04 03:08:27.752: W/System.err(1978): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107)
12-04 03:08:27.752: W/System.err(1978): at android.app.Activity.dispatchTouchEvent(Activity.java:2064)
12-04 03:08:27.752: W/System.err(1978): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1643)
12-04 03:08:27.752: W/System.err(1978): at android.view.ViewRoot.handleMessage(ViewRoot.java:1691)
12-04 03:08:27.752: W/System.err(1978): at android.os.Handler.dispatchMessage(Handler.java:99)
12-04 03:08:27.752: W/System.err(1978): at android.os.Looper.loop(Looper.java:123)
12-04 03:08:27.752: W/System.err(1978): at android.app.ActivityThread.main(ActivityThread.java:4370)
12-04 03:08:27.752: W/System.err(1978): at java.lang.reflect.Method.invokeNative(Native Method)
12-04 03:08:27.762: W/System.err(1978): at java.lang.reflect.Method.invoke(Method.java:521)
12-04 03:08:27.762: W/System.err(1978): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
12-04 03:08:27.762: W/System.err(1978): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
12-04 03:08:27.762: W/System.err(1978): at dalvik.system.NativeStart.main(Native Method)
12-04 03:08:32.082: E/BluetoothEventLoop.cpp(1184): event_filter: Received signal org.bluez.Device:PropertyChanged from /org/bluez/2002/hci0/dev_90_C1_15_37_AB_E7
I am going to write, what am I doing, while I get this error:
At first, I installed this app to both of my devices. When I start this app, a message pops up, which asks me to turn on bluetooth and set discoverablity forr 300 seconds. I click ok. Then I click the find button. This should find the device, which is called "Xperia Mini Pro". When the Bluetooth Device Found message is shown, I click the open button. And here comes the error.
Please help me to solve this problem, thanks.
If you look in the log you can find the error easily
12-04 03:08:27.742: W/System.err(1978): at com.example.proba2x8.MainActivity.openBT(MainActivity.java:147)
Line 147 of MainActivity is causing you the error of java.io.IOException: Service discovery failed
I'd suggest searching for the java.io.IOException: Service discovery failed error on Google, chances are you are not the first to have this problem.