Ich schaue mir das Morgen mal an und melde mich dann wieder.
Beiträge von omax1
-
-
Jetzt stehe ich etwas auf dem Schlauch. Die Permission Anfrage hat aber funktioniert, hat sich da was verändert, so das sie jetzt falsch ist?
-
hmm aber das Problem tritt ja unter Android 6.0 auf nicht unter 5.0. Unter Andorid 5.0 läuft die App.
-
Gradle von der Module:app nehme ich an :
apply plugin: 'com.android.application'android {
compileSdkVersion 26
buildToolsVersion "26.0.1"
defaultConfig {
applicationId "com.ba.bluetoothchat"
minSdkVersion 21
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:26.+'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
testCompile 'junit:junit:4.12'
} -
An einem Update von AS dürfte es nicht liegen, da ich gerade ein backup einer apk von vor 2 wochen getestet habe und es läuft damit unter Android 6.0 auch nicht, jedoch unter Android 5.0 schon. Habe den verdacht, dass es mit den zusätzlichen Berechtigungen unter Android 6.0 zusammen hängt. Die Methode in Zeile 30, die die zusätzlichen Bluetooth-Berechtigungen abfragt, hab ich so aber schon mal getestet gehabt und es hat funktioniert.
-
Da stehen die Namen von Geräten, die über Bluetooth gefunden werden. In Zeile 75 wird in diese ArrayList geaddet wenn ein Gerät gefunden wurde.
Edit1: Weiß nicht ob diese Info wichtig ist, aber die App hat vor 2 Wochen funktioniert gehabt. Habe die App dann heute nochmal gestartet und dann ging nichts mehr und habe am Code nichts verändert, dass wunder mich auch ein wenig. Kann das Problem am Gerät liegen aber wenn dann woran genau?
-
Nein das Problem ist nicht behoben, denn wenn ich wie oben beschrieben in Punkt 2 eine andere Liste übergebe stürzt die App zwar nicht ab, jedoch brauch ich ja die ArrayList die ich vorher übergeben hatte.
-
Ja debug modus versucht nichts auffälliges gefunden.
Allerdings habe ich gerade 2 Sachen bemerkt. Die Probleme treten auf einem Gerät mit Android 6.0 auf.
1. Auf einem 2. Gerät mit Android 5.0 läuft die App ohne Absturzt, weswegen ich denke, dass das Problem in der Methode in Zeile 30 liegt. Da hier ja nur eine Methode extra ist, die auf Android 6.0 einfluss hat.
2. Desweiteren stürzt die App auf dem Gerät mit Andorid 6.0 nicht ab, wenn ich für die Zeile 77 "setListAdapter(new ArrayAdapter<String>(getBaseContext(), android.R.layout.simple_list_item_1, discoveredDevicesNames));" statt der ArrayList "discoveredDevicesNames", eine neue Arraylist wie folgt anlege:- ArrayList<String> test = new ArrayList<>();
- test.add("Test");
- setListAdapter(new ArrayAdapter<String>(getBaseContext(), android.R.layout.simple_list_item_1, test));
Wenn ich es so wie in Punkt 2 mache stürzt die App auch nicht ab. -
Der Code:
Java
Alles anzeigenpublic class MainActivity extends ListActivity { final private int REQUEST_CODE_ASK_PERMISSION = 123; //Für die Permission Anfrage ab Android 6.0 BluetoothAdapter bluetoothAdapter; BroadcastReceiver discoverDevicesReceiver; BroadcastReceiver discoveryFinishedReceiver; ArrayList<BluetoothDevice> discoveredDevices; ArrayList<String> discoveredDevicesNames; ServerThread serverThread; ConnectToServerThread connectToServerThread; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); discoveredDevices = new ArrayList<BluetoothDevice>(); //Enthält die gefundenen Geräte discoveredDevicesNames = new ArrayList<String>(); //Enthält die Namen der gefundenen Geräte bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); accessLocationPermission(); } //Permission Anfrage für Geräte ab Android 6.0 @TargetApi(Build.VERSION_CODES.M) private void accessLocationPermission() { int BuildVersion = Integer.valueOf(Build.VERSION.SDK_INT); if(BuildVersion > 22) { int accessCoarseLocation = checkSelfPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION); int accessFineLocation = checkSelfPermission(android.Manifest.permission.ACCESS_FINE_LOCATION); List<String> listRequestPermission = new ArrayList<String>(); if (accessCoarseLocation != PackageManager.PERMISSION_GRANTED) { listRequestPermission.add(android.Manifest.permission.ACCESS_COARSE_LOCATION); } if (accessFineLocation != PackageManager.PERMISSION_GRANTED) { listRequestPermission.add(android.Manifest.permission.ACCESS_FINE_LOCATION); } if (!listRequestPermission.isEmpty()) { String[] strRequestPermission = listRequestPermission.toArray(new String[listRequestPermission.size()]); requestPermissions(strRequestPermission, REQUEST_CODE_ASK_PERMISSION); } } } public void MakeDiscoverable(View view){ Intent i = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); i.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300); startActivity(i); } public void DiscoverDevices(View view){ DiscoveringDevices(); } private void DiscoveringDevices(){ if(discoverDevicesReceiver == null){ discoverDevicesReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if(BluetoothDevice.ACTION_FOUND.equals(action)){ BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); if(!discoveredDevices.contains(device)){ discoveredDevices.add(device); discoveredDevicesNames.add(device.getName()); setListAdapter(new ArrayAdapter<String>(getBaseContext(), android.R.layout.simple_list_item_1, discoveredDevicesNames)); } } } }; } if(discoveryFinishedReceiver == null){ discoveryFinishedReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { getListView().setEnabled(true); Toast.makeText(getBaseContext(), "Erkennung abgeschlossen. Wählen Sie ein Gerät um Chatten zu beginnen.", Toast.LENGTH_LONG).show(); unregisterReceiver(discoveryFinishedReceiver); } }; } IntentFilter filter1 = new IntentFilter(BluetoothDevice.ACTION_FOUND); IntentFilter filter2 = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); registerReceiver(discoverDevicesReceiver, filter1); registerReceiver(discoveryFinishedReceiver, filter2); getListView().setEnabled(false); Toast.makeText(getBaseContext(), "Der Erkennungsvorgang läuft. Bitte Warten...", Toast.LENGTH_LONG).show(); bluetoothAdapter.startDiscovery(); } @Override public void onResume(){ super.onResume(); serverThread = new ServerThread(bluetoothAdapter); serverThread.start(); } @Override public void onPause(){ super.onPause(); bluetoothAdapter.cancelDiscovery(); if(discoverDevicesReceiver != null){ try { unregisterReceiver(discoverDevicesReceiver); }catch (Exception e){ } } if(connectToServerThread != null){ try { connectToServerThread.bluetoothSocket.close(); }catch (IOException e){ Log.d("MainActivity", e.getLocalizedMessage()); } } if(serverThread != null){ serverThread.cancel(); } } public void onListItemClick(ListView parent, View v, int position, long id){ if(connectToServerThread != null){ try { connectToServerThread.bluetoothSocket.close(); }catch (IOException e ){ Log.d("MainActivity", e.getLocalizedMessage()); } } BluetoothDevice deviceSelected = discoveredDevices.get(position); connectToServerThread = new ConnectToServerThread(deviceSelected, bluetoothAdapter); connectToServerThread.start(); Toast.makeText(this, "Sie sind verbunden mit "+ discoveredDevices.get(position).getName(), Toast.LENGTH_SHORT).show(); } public void sendMessage(String bef){ if(connectToServerThread != null){ Log.d(TAG, "Vor dem Senden"); new WriteTask().execute(bef); Log.d(TAG, "Nach dem Senden"); } else { Toast.makeText(this, "Zuerst einen Client wählen.", Toast.LENGTH_SHORT).show(); } } private class WriteTask extends AsyncTask<String, Void, Void>{ protected Void doInBackground(String... args){ try { connectToServerThread.commsThread.write(args[0]); }catch (Exception e){ Log.d("MainActivity", e.getLocalizedMessage()); } return null; } } }
-
Hallo,
ich habe das Problem, dass meine App beim Drücken eines Buttons abstürzt. In der Log wird mir aber nicht angezeigt, in welcher Zeile das Problem liegt, nur das eine NullPointerException das Problem ist.
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference
at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:401)
at android.widget.ArrayAdapter.getView(ArrayAdapter.java:369)
at android.widget.AbsListView.obtainView(AbsListView.java:2929)
at android.widget.ListView.measureHeightOfChildren(ListView.java:1305)
at android.widget.ListView.onMeasure(ListView.java:1212)
at android.view.View.measure(View.java:20151)
at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:716)
at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:462)
at android.view.View.measure(View.java:20151)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6328)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1464)
at android.widget.TableLayout.measureChildBeforeLayout(TableLayout.java:461)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:747)
at android.widget.TableLayout.measureVertical(TableLayout.java:473)
at android.widget.TableLayout.onMeasure(TableLayout.java:436)
at android.view.View.measure(View.java:20151)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6328)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
at android.view.View.measure(View.java:20151)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6328)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1464)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:747)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:629)
at android.view.View.measure(View.java:20151)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6328)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
at com.android.internal.policy.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:3158)
at android.view.View.measure(View.java:20151)
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2594)
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1549)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1841)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1437)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7397)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:920)
at android.view.Choreographer.doCallbacks(Choreographer.java:695)
at android.view.Choreographer.doFrame(Choreographer.java:631)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:906)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:158)
at android.app.ActivityThread.main(ActivityThread.java:7225)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) -
Hallo, sry das ich gestern nicht mehr geantwortet habe mir ist was dazwischen gekommen.
Habe es jetzt mit dem Handler geschafft und kann die UI verändern. Vielen dank für die Hilfe.
-
Der Thread wird ja aber nie beendet, weil das empfangen neuer Daten in einer while(true) ist. Ist es dann trotzdem eine schlechte idee das so zu machen?
Ich lese mir mal die Links durch.
P.S. Die Daten die empfangen werden, kommen von einem 2. Android Gerät auf dem die selbe App läuft.
-
Feld ist meine Activity in dem ein Feld aufgebaut ist. Außerdem ist ein w in dieser Activity enthalten. Und dieser w soll verändert werden mit den Daten die empfangen werden.
-
Aber über die Run Methode rufe ich ja die andere Methode in der selben Klasse "empfangenenStringBearbeiten" auf. Läuft die dann nicht mehr in dem Thread? und sobald die Methode abgearbeitet ist müsste er doch zurück in die Run Methode gehen.
-
Hallo,
ich habe eine Activity, die mein Hauptthread ist. Desweiteren habe ich noch einen weiteren Thread, der Daten per Bluetooth empfängt. Mithilfe der Daten die ich empfange, will ich eine Imageview auf dem Hauptthread verändern. Jedoch bekomme ich immer die Fehlermeldung: "Only the original thread that created a view hierarchy can touch its views". Ich habe bereits herausgefunden, dass es die möglichkeit gibt, über "runOnUiThread" auf das Imageview zuzugreifen. Jedoch klappt es nicht. Wo muss das runOnUiThread genau hin und wie viel vom Code muss da rein. Würde es einfach reichen, denn Teil vom empfangen der Daten reinzupacken oder muss die Zeile die versucht auf das Imageview zuzugreifen da rein.
P.S.: Der Fehler tritt in Zeile 105 auf.
-
Perfekt. Das hat mein Problem mit dem finden gelöst. Beide Geräte finden sich jetzt.
Hatte zwar noch einen weiteren Bug mit dem verbinden aber das geht jetzt auch.
Vielen Dank.
-
So jetzt stehe ich aber vor folgendem Problem. Der Aufruf in Zeile 20 erwartet einen zweiten Parameter vom Typ int. Aber was genau erwartet er da?
-
Gerät 1 Android 5.1 (findet Gerät 2) und Gerät 2 Android 6.0.1 (findet Gerät 1 nicht).
Gerät 1: Archos 50c
Gerät 2: Samsung Galaxy Note 4 -
Über die System App werden die Geräte vom jeweils anderem Gerät gefunden.
Habe es versucht indem ich beide Geräte gepairt habe und dann mit meiner App und beide Geräte nicht gepaired und ebenfalls getestet wieder kein Erfolg.
-
Genau die Geräte, möchte ich mit der Methode in Zeile 41 Sichtbar machen erstmal. Danach Suche ich mit der Methode in Zeile 48 bzw. 53 nach Geräten die Sichtbar sind. Alle Geräte die gefunden wurden, sollen ab Zeile 70 in einer Listview angezeigt werden. Nach dem der Suchvorgang abgeschlossen ist, wird die Listview freigegeben damit ein gefundenes Gerät in der Listview ausgewählt werden kann, womit man sich verbinden will. Und das soll mit der Methode in Zeile 178 stattfinden.
Nur findet wird nur eines der beiden Geräte auch vom anderen gefunden. Es finden sich nicht beide Geräte gegenseitig.