Obsługa Bluetooth na androidzie

0

Witam,
próbuję napisać aplikację na androida do obsługi Bluetooth. I mam już na samym początku problem. Chcę najpierw włączyć moduł BT więc napisałem w funkcji obsługującej kliknięcie.

BluetoothAdapter btAdapter = BluetoothAdapter.getDefaultAdapter();
btAdapter.enable();

Jednak po kliknięciu zamiast włączyć moduł BT pojawia się
Niestety, aplikacja MyBT została zatrzymana.
Posiadam I9000 z androidem 4.4.2(SilmKAT) a projekt mam ustawiony na
min. SDK: API 7 Android 2.1
Target i compile with to API 19 4.4.2

0

A masz dodane uprawnienia dla tej aplikacji do używania BT i co więcej do administrowania nim? Nie? To dodaj ;]

0

Mam, w AndroidManifest
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permisdion.BLUETOOTH_ADMIN" />

0

A co się pojawia w logach? Bo rozumiem że deployujesz z poziomu IDE więc powinieneś mieć wgląd w logi w IDE.

0

02-17 11:21:45.597  22538-22538/example.mybtapplication E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: example.mybtapplication, PID: 22538
    java.lang.IllegalStateException: Could not execute method of the activity
            at android.view.View$1.onClick(View.java:3823)
            at android.view.View.performClick(View.java:4438)
            at android.view.View$PerformClick.run(View.java:18422)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5050)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.reflect.InvocationTargetException
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at android.view.View$1.onClick(View.java:3818)
            at android.view.View.performClick(View.java:4438)
            at android.view.View$PerformClick.run(View.java:18422)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5050)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.SecurityException: Need BLUETOOTH ADMIN permission: Neither user 10110 nor current process has android.permission.BLUETOOTH_ADMIN.
            at android.os.Parcel.readException(Parcel.java:1465)
            at android.os.Parcel.readException(Parcel.java:1419)
            at android.bluetooth.IBluetoothManager$Stub$Proxy.enable(IBluetoothManager.java:251)
            at android.bluetooth.BluetoothAdapter.enable(BluetoothAdapter.java:521)
            at example.mybtapplication.MainActivity.BClick1(MainActivity.java:29)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at android.view.View$1.onClick(View.java:3818)
            at android.view.View.performClick(View.java:4438)
            at android.view.View$PerformClick.run(View.java:18422)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5050)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
            at dalvik.system.NativeStart.main(Native Method)

0

No to ktoś tu kłamie ;]

Caused by: java.lang.SecurityException: Need BLUETOOTH ADMIN permission: Neither user 10110 nor current process has android.permission.BLUETOOTH_ADMIN.

Dla ułatwienia sobie życia odpal intenta z właczaniem BT, user sobie kliknie że sie zgadza i będzie po kłopocie.

0

Chyba, że w złym miejscu wpisałem te uprawnienia.
Umieściłem je pod <uses-sdk />

<uses-sdk
        android:minSdkVersion="7"
        android:targetSdkVersion="19" />
    <uses-permission android:name="android.permission.BLUETOOTH"/>
    <uses-permission android:name="android.permisdion.BLUETOOTH_ADMIN"/>

Wolałbym, żeby użytkownik nie musiał dodatkowo klikać, że zezwala.

0

Ide pozwoli Ci na mnóstwo złych rzeczy z całkowitą destrukcją projektu włącznie (więc trzeba polegać na sobie, a nie na programie w większości przypadków). "Wolałbym, żeby użytkownik nie musiał dodatkowo klikać, że zezwala." - nie myśl tak nigdy projektując aplikację mobilną. Na szczęście jest rosnąca tendencja do natychmiastowego kasowania nowo zainstalowanych aplikacji, które wykonują jakieś czynności bez wiedzy/potwierdzenia użytkownika.

0

Aplikacja nie ma nic złego robić.
Ma mieć za zadanie włączyć bt. połączyć się z modułem bt podłączonym do AVR(na razie chcę żeby się połączył z bt w moim laptopie), wysłania ciągu znaków(które AVR po odbiorze ma odpowiednio zinterpretować) a następnie ma się rozłączyć i wyłączyć moduł bt. Apki będę raczej głownie ja używał może jeszcze jeden znajomy i moim zdaniem, dodatkowe klikanie na potwierdzenie włączenia będzie nieco irytujące i wolałbym tego unikać.

Udało mi się pokonać ten problem. Wszystkiemu była winna literówka w

<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

było permisdion zamiast permission.

Jednak teraz mam kolejny problem.
Dopisałem funkcje odpowiedzialne za połączenie z bt.
W linijce btdevice = btAdapter.getRemoteDevice("40861B:EB"); wpisałem adres MAC bluetooth który odczytałem z programu BlueSoleil.
Kod z mainactivity.java

import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothServerSocket;
import android.bluetooth.BluetoothSocket;
import android.os.Bundle;
import android.app.Activity;
import android.os.Handler;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import java.io.IOException;
import java.io.OutputStream;
import java.util.UUID;

public class MainActivity extends Activity {

    //Obiekty odpowiedzialne za bluetooth
    BluetoothAdapter btAdapter = BluetoothAdapter.getDefaultAdapter();
    BluetoothDevice btdevice;
    BluetoothSocket btsocket;
    UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb");
    private OutputStream os;    // Strumień wyjsciowy odpowiedzialny za wysyłanie danych

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        setButton();
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
/*
    public void BClick1(View view){
        BluetoothAdapter btAdapter = BluetoothAdapter.getDefaultAdapter();

        btAdapter.enable();
    }
*/
    private void setButton(){

        Button przycisk1 = (Button) findViewById(R.id.button);
        przycisk1.setOnClickListener(new View.OnClickListener(){


            @Override
            public void onClick(View v) {

                btAdapter.enable();

            }
        });

        Button przycisk2 =(Button) findViewById(R.id.button2);
        przycisk2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

//                btAdapter.disable();
                InitBT();
                makeToast("inicjalizacja");

            }
        });

        Button przycisk3 = (Button) findViewById(R.id.button3);
        przycisk3.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                polaczBT();
                makeToast("Kanpai!");
            }
        });
    }
	private void InitBT(){
        //Ustawienie adresu MAC urządzenia z którym ma się połączyć aplikacja
            btdevice = btAdapter.getRemoteDevice("40:61:86:A0:1B:EB");

    }

    private void polaczBT(){
        try{
            btsocket = btdevice.createInsecureRfcommSocketToServiceRecord(MY_UUID);
            btsocket.connect();
            if(btsocket.isConnected())
                makeToast("działa");
            else
                makeToast("nie działa");



        }catch(IOException e){
            makeToast("Błąd połączenia: " + e);
        }
    }


    private void makeToast(String s){
        Toast t = Toast.makeText(this, s, Toast.LENGTH_LONG);
        t.show();
    }
}

Klikam pierwszy przycisk, włącza się moduł bluetooth.
Klikam drugi pojawia się napis inicjalizacja
Gdy klikam na trzeci przycisk to po chwili pojawia mi się
*błąd połączenia java.io.ioexception: read failed, socket might closed or timeout, read ret: -1 *

btdevice jak wyświetliłem to pokazuje mac bt laptopa. A pod btsocket kryje się android.bluetooth.bluetoothsocket@41c65e52 (ta końcówka po @ zmienia się).
Czyżbym zapomniał o czymś?

1 użytkowników online, w tym zalogowanych: 0, gości: 1