首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法获取Android本机访问权限

无法获取Android本机访问权限
EN

Stack Overflow用户
提问于 2016-07-25 20:58:57
回答 1查看 127关注 0票数 1

尝试使用本地访问在android中实现蓝牙功能,但在设备上启动应用程序时,本地访问变量似乎为空。需要帮助来弄清楚为什么会发生这种情况,以及如何解决它。谢谢

这些是我的构建提示

StateMachine类中的用法示例

代码语言:javascript
运行
复制
    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

代码语言:javascript
运行
复制
    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{

代码语言:javascript
运行
复制
//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;
}

}

EN

Stack Overflow用户

回答已采纳

发布于 2016-07-26 02:10:05

您可能还需要BLUETOOTH_ADMIN权限。我不确定这是否是唯一的问题,但肯定会带来问题。

来自Android的开发者指南:

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

在将impl类的继承更改为派生Activity时,您还犯了一个大错误!

您需要创建一个单独的activity类,并在创建impl类和Android创建activity类时分别注册它,两者是不同的。我建议看看其他cn1libs,它们大多数都是开源的,看看这是如何做到的。我还建议用电缆连接您的设备,并在ddms中查看输出以跟踪问题。

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38568447

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档