Bluetooth Tethering ON / OFF

H

herrm_no

Ambitioniertes Mitglied
Threadstarter
Hallo.
Ich bin dabei mir eine App zu programmieren um eine Verbindung vom Handy mit dem Auto herzustellen.
Es gibt Apps dazu, aber ich möchte dieses gerne selbst zum lernen programmieren.
Es ist keine Problem per Programm Bluetooth aus und ein zu schalten.
Allerdings schaffe ich es einfach nicht das Bluetooth Tethering per App ein und aus zu schalten.
(Android Settings/Tethering/BluetoothTethering OnOff)
Kann mir vielleicht jemand helfen und die Richtung vorgeben was man da tun muss ?
Vielleicht kennt ja auch einer eine Seite oder einen Code dazu.
Hab schon echt lange gesucht und vieles probiert (über viele Stunden) aber nichts will funktionieren.

Gruß
 
swa00

swa00

Moderator
Teammitglied
Hallo

ich habe jetzt nicht explizit recherchiert , allerdings bin ich der Meinung das Tethering eines
der sicherheitsrelvanten Eigenschaften (> API 19) ist , welches mittels App nicht enabled/disabled werden kann.
 
H

herrm_no

Ambitioniertes Mitglied
Threadstarter
Vielen Dank erst mal für deine Antwort.
Es muss aber doch irgendwie möglich sein, da ich eine App habe die das kann.
Die App ist nur sehr einfach gehalten und ich möchte mir eine App programmieren mit ein paar Zusatzfunktionen.
Mein Handy ist auch ein LG G4 > API19

Gruß
herrm_no
 
H

herrm_no

Ambitioniertes Mitglied
Threadstarter
Hallo

hier mal der Code.
der Code zwischen den Kommentaren 1111##### und 2222##### ist der eingefügte.
Er bringt mir immer "BT Tethering is OFF"
Wenn ich
Eigentlich bricht er mir hier in dieser Zeile schon ab bzw. geht auch catch
Code:
synchronized (mutex) {
                setTetheringOn.invoke(instance, true);
Ich muss aber zugeben das ich den Code für das Tethering nicht so recht verstehe.
Das ist auch eine Kopie von dem Stackoverflow Forum.



Code:
package com.herrm_no.bttetheringonoff;

import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothProfile;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class MainActivity extends AppCompatActivity {

private static final String TAG = "MainActivity";
public BluetoothAdapter mBluetoothAdapter;


    Object instance = null;
    Method setTetheringOn = null;
    Method isTetheringOn = null;
    Object mutex = new Object();

    // Create a BroadcastReceiver for ACTION_FOUND.
    private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (action.equals(mBluetoothAdapter.ACTION_STATE_CHANGED)) {
            final int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE,mBluetoothAdapter.ERROR);
            switch (state) {
                case BluetoothAdapter.STATE_OFF:
                    Log.d(TAG, "onReceiver: STATE OFF");
                    break;
                case BluetoothAdapter.STATE_TURNING_OFF:
                    Log.d(TAG, "onReceiver: STATE TURNING OFF");
                    break;
                case BluetoothAdapter.STATE_ON:
                    Log.d(TAG, "onReceiver: STATE ON");
                    break;
                case BluetoothAdapter.STATE_TURNING_ON:
                    Log.d(TAG, "onReceiver: STATE TURNING ON");
                    break;
                }
            }
        }
    };

    @Override
    protected void onDestroy(){
        Log.d(TAG,"onDestroy called.");
        super.onDestroy();
        unregisterReceiver(mBroadcastReceiver);
    }


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        getSupportActionBar().setDisplayShowHomeEnabled(true);
        getSupportActionBar().setLogo(R.mipmap.ic_launcher);
        getSupportActionBar().setDisplayUseLogoEnabled(true);

        setContentView(R.layout.activity_main);
        Button btnONOFF = findViewById(R.id.btnOnOff);
        mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

        btnONOFF.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d(TAG, "onClick: enable/disabling bluetooth");
                enableDisableBT();
            }
        });

    }
    public void enableDisableBT() {

        if (mBluetoothAdapter == null) {
            Log.d(TAG, "enableDisableBT: Does not have BT capabilities.");
        }
        if (!mBluetoothAdapter.isEnabled()) {
            Log.d(TAG, "enableDisableBT: enabling BT");
            Intent enableBTIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivity(enableBTIntent);
            IntentFilter BTIntent = new IntentFilter((BluetoothAdapter.ACTION_STATE_CHANGED));
            registerReceiver(mBroadcastReceiver,BTIntent);

// 1111111########################################################################################
            String sClassName = "android.bluetooth.BluetoothPan";

            try {

                Class<?> classBluetoothPan = Class.forName(sClassName);

                Constructor<?> ctor = classBluetoothPan.getDeclaredConstructor(Context.class, BluetoothProfile.ServiceListener.class);
                ctor.setAccessible(true);
                //  Set Tethering ON
                Class[] paramSet = new Class[1];
                paramSet[0] = boolean.class;

                synchronized (mutex) {
                    setTetheringOn = classBluetoothPan.getDeclaredMethod("setBluetoothTethering", paramSet);
                    isTetheringOn = classBluetoothPan.getDeclaredMethod("isTetheringOn", null);
                    instance = ctor.newInstance(getApplicationContext(), new BTPanServiceListener(getApplicationContext()));
                }
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
//1111111####################################################################################

        if (mBluetoothAdapter.isEnabled()){
            Log.d(TAG, "enableDisableBT: disabling BT");
            mBluetoothAdapter.disable();
            IntentFilter BTIntent = new IntentFilter((BluetoothAdapter.ACTION_STATE_CHANGED));
            registerReceiver(mBroadcastReceiver,BTIntent);

        }
    }


//2222###########################################
public class BTPanServiceListener implements BluetoothProfile.ServiceListener {

    private final Context context;

    public BTPanServiceListener(final Context context) {
        this.context = context;
    }

    @Override
    public void onServiceConnected(final int profile,
                                   final BluetoothProfile proxy) {
        //Some code must be here or the compiler will optimize away this callback.

        try {
            synchronized (mutex) {
                setTetheringOn.invoke(instance, true);
                if ((Boolean)isTetheringOn.invoke(instance, null)) {
                    Toast.makeText(getApplicationContext(), "BT Tethering is on", Toast.LENGTH_LONG).show();
                }
                else {
                    Toast.makeText(getApplicationContext(), "BT Tethering is off", Toast.LENGTH_LONG).show();
                }
            }
        }
        catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onServiceDisconnected(final int profile) {
    }
}
//2222###############################################################################################################################
}
 
swa00

swa00

Moderator
Teammitglied
Der Weg ist schon mal Richtig ...

Jetzt wäre es an dieser Stelle angebracht , ein Step für Step debugging anzubringen , um festzustellen ,
welcher Trace anschlägt und warum.
Error LogCat vorhanden ??


P.S Manifest Einträge/Permissions sind korrekt ?
 
Zuletzt bearbeitet:
H

herrm_no

Ambitioniertes Mitglied
Threadstarter
Womit ich überhaupt keine Erfahrung habe ist
ob der Inhalt von
setTeheringOn,
isTetheringOn,
instance überhaupt schon richtig sind
auch das classBluetoothPan: "" leer ist, kommt mir komisch vor.

manifest einträge siehe weiter unten

upload_2019-4-5_7-52-23.png


Manifest Einträge sind (Ich das eigentlich nur 2 von denen gereicht hätten.)


<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.hardware.bluetooth" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
 
swa00

swa00

Moderator
Teammitglied
Das Code - Beispiel basiert darauf , dass mit der Klasse gearbeitet wird.
Solange die nicht gefunden wird , ist klar , dass du nicht weiterkommst.

Hier einer ein ähnliches Problem
cannot find symbol class BluetoothPan


NACHTRAG :

Habe eben noch was Schönes für dich gefunden -
mukesh4u/BlutoothTethering

Der Code sieht vielversprechend aus
 
Zuletzt bearbeitet:
H

herrm_no

Ambitioniertes Mitglied
Threadstarter
Danke für deine Antworten.
Den Code von deinem Link hatte ich auch schon.
Hat aber nicht funktioniert.
Allerdings weis ich jetzt worauf ich achten muss.
Ich werde jetzt mal suchen und mich dann wieder melden

Danke und Gruß
 
H

herrm_no

Ambitioniertes Mitglied
Threadstarter
Hallo
jetzt hab ich aber doch noch Fragen.
Den code von BluetoothTethering konnte ich auch zum laufen bringen - hat aber das selbe Problem.
Also mir ist das mit der "fehlenden Klasse" BluetoothPan klar.
Ich konnte mir auch das File BluetoothPan.java vom Internet runter laden.
Nun muss ich zugeben, das ich zwar schon ein bisschen Hobby mäßig programmiert habe aber nicht weis, wie ich
z.B. BluetoothPan.java in meine Programm einbinden kann.
Ich kann eine eigene Klasse erzeugen und den Text dort reinkopieren - das ist mir schon klar.
Aber ich weis nicht wie ich das anstellen muss damit es
z.B. mit
a) import android.bluetooth.bluetoothpan;
oder
b) classBluetoothPan = Class.forName("android.bluetooth.BluetoothPan");
in Android Studio funktioniert.
Kannst du mir da bitte auf die Sprünge helfen.
Bin froh was neues dazu zu lernen. :)

Gruß
herrm_no
 
D

deek

Stammgast
Du kannst nicht einfach eine Framework Klasse in den Source kopieren, das wird nicht funktionieren.
Die Klasse findet er eigentlich ja schon, sonst wäre die Method ja null. Er kann ja keine Method finden zu einer Klasse, die er vorher nicht gefunden hat.
Ich nehme an, dass einfach das Rechtemanagement den Call verhindert.
Schau mal ob im Logcat eine SecurityException zu finden ist.
 
H

herrm_no

Ambitioniertes Mitglied
Threadstarter
Also ich hab jetzt mein Problem gefunden.
Eigentlich hätte schon alles funktioniert jedoch musst ich im Manifest

Code:
 <uses-permission-sdk-23 android:name="android.permission.WRITE_SETTINGS" />
einstellen und im
Build.gradle
Code:
android {
    compileSdkVersion 27
    defaultConfig {
        applicationId "com.herrm_no.bttetheringonoff"
        minSdkVersion 22
        //noinspection ExpiredTargetSdkVersion
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
Die targetSdKVersion von 27 auf 22 umstellen..
Das war eigentlich der Hauptfehler. Ich habe immer ein neues Projekt erstellt und da war die TargetSDK Version immer auf 27.
Ich versteh allerdings immer noch nicht so recht warum es auf SDKVersion 22 und kleiner funtioniert und höher nicht mehr.
Unabhängig welche Android Version auf dem Handy installiert ist.

Danke aber für die Super Hilfe
Gruß herrm_no
 
Oben Unten