1. Chuwi Hi9 Air LTE Gewinnspiel ! Alle Informationen findest Du hier!
  1. herrm_no, 04.04.2019 #1
    herrm_no

    herrm_no Threadstarter Android-Hilfe.de Mitglied

    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ß
     
  2. swa00, 05.04.2019 #2
    swa00

    swa00 Moderator Team-Mitglied

    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.
     
  3. herrm_no, 05.04.2019 #3
    herrm_no

    herrm_no Threadstarter Android-Hilfe.de Mitglied

    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
     
  4. swa00, 05.04.2019 #4
    swa00

    swa00 Moderator Team-Mitglied

    Zuletzt bearbeitet: 05.04.2019
  5. herrm_no, 05.04.2019 #5
    herrm_no

    herrm_no Threadstarter Android-Hilfe.de Mitglied

    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###############################################################################################################################
    }
    
    
    
     
  6. swa00, 05.04.2019 #6
    swa00

    swa00 Moderator Team-Mitglied

    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: 05.04.2019
  7. herrm_no, 05.04.2019 #7
    herrm_no

    herrm_no Threadstarter Android-Hilfe.de Mitglied

    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" />
     
  8. swa00, 05.04.2019 #8
    swa00

    swa00 Moderator Team-Mitglied

    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: 05.04.2019
  9. herrm_no, 05.04.2019 #9
    herrm_no

    herrm_no Threadstarter Android-Hilfe.de Mitglied

    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ß
     
  10. herrm_no, 05.04.2019 #10
    herrm_no

    herrm_no Threadstarter Android-Hilfe.de Mitglied

    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
     
  11. deek, 05.04.2019 #11
    deek

    deek Android-Experte

    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.
     
  12. herrm_no, 08.04.2019 #12
    herrm_no

    herrm_no Threadstarter Android-Hilfe.de Mitglied

    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
     
    numanoid bedankt sich.
Die Seite wird geladen...
Ähnliche Themen Forum Datum
App-Wunsch: Smartcard-App für Bluetooth-Leser Android App Entwicklung 19.02.2019
Keyboard Press simulieren Android App Entwicklung 13.11.2018
Wie float wert von android App an desktop Applikation per Bluetooth senden? Android App Entwicklung 29.10.2018
alle 100 ms Daten über Bluetooth senden Android App Entwicklung 15.08.2018
Bluetooth LE mit MIT App Inventor 2 Android App Entwicklung 15.06.2018
Du betrachtest das Thema "Bluetooth Tethering ON / OFF" im Forum "Android App Entwicklung",
  1. Android-Hilfe.de verwendet Cookies um Inhalte zu personalisieren und dir den bestmöglichen Service zu gewährleisten. Wenn du auf der Seite weitersurfst stimmst du der Cookie-Nutzung zu.  Ich stimme zu.