2016-07-25 35 views
1

ネイティブアクセスを使用してAndroid搭載のBluetooth機能を実装しようとしましたが、デバイス上でアプリを起動するとネイティブアクセス変数がnullと思われます。それがなぜ起こったのか、それをどのように解決するのかを理解する上で助けが必要です。おかげAndroidネイティブアクセスを取得できません

私のビルドは enter image description here

ステートマシンのクラスの使用例をヒントこれらは

BTNative nativeBT = (BTNative)NativeLookup.create(BTNative.class); 
@Override 
protected void onMain_ScanButtonAction(Component c, ActionEvent event) { 
    super.onMain_ScanButtonAction(c, event); 
    try { 

     if (nativeBT != null && nativeBT.isSupported()) { 

      try { 
       nativeBT.findBT(); 
       nativeBT.openBT(); 
      } catch (Throwable t) { 
       Dialog.show("Error", "Exception during findBT and openBT access: " + t, "OK", null); 
      } 
     }else{ 
      Dialog.show("Error", "Can't get native access", "OK", null); 
     } 

    } catch (Throwable t) { 
     Dialog.show("Error", "Exception during native access: " + t, "OK", null); 
    } 
} 

NativeImpl

import android.bluetooth.BluetoothAdapter; 
    import android.bluetooth.BluetoothDevice; 
    import android.bluetooth.BluetoothSocket; 
    import android.content.Intent; 
    import android.app.Activity; 
    import android.os.Bundle; 
    import android.os.Handler; 
    import java.io.IOException; 
    import java.io.InputStream; 
    import java.io.OutputStream; 
    import java.util.Set; 
    import java.util.UUID; 
    import android.widget.Toast; 

パブリッククラスBTNativeImpl {

//android built in classes for bluetooth operations 
BluetoothAdapter mBluetoothAdapter; 
BluetoothSocket mmSocket; 
BluetoothDevice mmDevice; 

//needed for communication to bluetooth device/network 
OutputStream mmOutputStream; 
InputStream mmInputStream; 
Thread workerThread; 

byte[] readBuffer; 
int readBufferPosition; 
volatile boolean stopWorker; 



public void closeBT() { 
    try { 
     stopWorker = true; 
     mmOutputStream.close(); 
     mmInputStream.close(); 
     mmSocket.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

//this will send text data to be printed by the bluetooth printer 
public void sendData(String param){ 
    try { 
     // the text typed by the user 
     param += "\n"; 
     mmOutputStream.write(param.getBytes()); 
     // tell the user data were sent 
     } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

//this will find a bluetooth printer device 
public void findBT() { 

    try { 
     mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 

     if (mBluetoothAdapter == null) { 

      Toast.makeText(com.codename1.impl.android.AndroidNativeUtil.getActivity(), "No bluetooth adapter available", Toast.LENGTH_LONG).show(); 
     } 
     if (!mBluetoothAdapter.isEnabled()) { 
      Intent enableBluetooth = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); 
      com.codename1.impl.android.AndroidNativeUtil.getActivity().startActivityForResult(enableBluetooth, 0); 
     } 

     Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices(); 

     if (pairedDevices.size() > 0) { 
      for (BluetoothDevice device : pairedDevices) { 
       if (device.getName().equals("BlueTooth Printer")) { 
        mmDevice = device; 
        break; 
       } 
      } 
     } 
     Toast.makeText(com.codename1.impl.android.AndroidNativeUtil.getActivity(), "Bluetooth device found.", Toast.LENGTH_LONG).show(); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

public void openBT() { 
    try { 
     //Standard SerialPortService ID 
     UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb"); 
     mmSocket = mmDevice.createRfcommSocketToServiceRecord(uuid); 
     mmSocket.connect(); 
     mmOutputStream = mmSocket.getOutputStream(); 
     mmInputStream = mmSocket.getInputStream(); 
     beginListenForData(); 
     Toast.makeText(com.codename1.impl.android.AndroidNativeUtil.getActivity(), "Bluetooth Opened", Toast.LENGTH_LONG).show(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

public 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); 
            // specify US-ASCII encoding 
            final String data = new String(encodedBytes, "US-ASCII"); 
            readBufferPosition = 0; 

            // tell the user data were sent to bluetooth printer device 
            handler.post(new Runnable() { 
             public void run() { 
              Toast.makeText(com.codename1.impl.android.AndroidNativeUtil.getActivity(), data, Toast.LENGTH_LONG).show(); 
             } 
            }); 
           } else { 
            readBuffer[readBufferPosition++] = b; 
           } 
          } 
         } 

        } catch (IOException ex) { 
         stopWorker = true; 
        } 

       } 
      } 
     }); 

     workerThread.start(); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

public boolean isSupported() { 
    return true; 
} 

}

答えて

1

また、BLUETOOTH_ADMIN権限も必要です。私はそれが唯一の問題であるかどうかはわかりませんが、間違いなく問題を引き起こすでしょう。

Androidの開発者のガイドから:

https://developer.android.com/guide/topics/connectivity/bluetooth.html#Permissions

またActivityを導き出すためのimplクラスの継承を変更するには大きなミスを犯しました!

個別のアクティビティクラスを作成し、それを個別に登録する必要があります。これは、インプリメントクラスを作成し、Androidがアクティビティクラスを作成するときと、異なる場合があります。私は他のcn1libsを見て、これがどのように行われたかを見るためにオープンソースであることをお勧めします。また、デバイスをケーブルで接続し、問題を追跡するためにddmsで出力を表示することをお勧めします。

+0

私はいくつかの追加の洞察を加えました –

+0

@ JamesH @ ShaiAlmog ** com.codename1.impl.android.AndroidNativeUtil.getActivity()**を使用して提案したことを試しましたが、** Activity **を拡張していませんが、現在は何もありませんボタンをクリックして接続すると発生します。私はddmsを見て、(Bluetoothの許可を持っていないアプリでは)bluetoothのアクセス許可が拒否されたことがわかりました。しかし、私も許可を含んでいます.. – 4bdu1

+0

@ JamesH @ ShaiAlmogまた、私はbluetoothのアクセス許可が表示されないアプリケーションをインストールするには。 – 4bdu1

関連する問題