Android蓝牙文件传输.apk

时间:2017-09-12 14:52:27

标签: android file bluetooth apk

打算:
我正在尝试开发一个单一用途的应用程序,你无法退出。它应该在手机上作为“操作系统”运行。这款手机将用于其他目的。该应用程序将不会在游戏商店中,你也不能离开它所以我需要更新它,否则如果我有更新的版本。为此,我写了另一个应用程序,你可以称之为“updater-app”。我想通过蓝牙进行此更新。我已经准备好了所有内容,并准备好进行文件传输手机可以通过InsecureRfcommSocket连接。我还设法选择了我想用updater-app上的选择器发送的.apk文件,并且我在本代码中将uri转换为字节:

sendUpdateButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (mBtService != null) {
                Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
                intent.setType("application/vnd.android.package-archive");
                intent.addCategory(Intent.CATEGORY_OPENABLE);

                try {
                    startActivityForResult(Intent.createChooser(intent, "Choose .apk"), FILE_SELECT_CODE);
                } catch (android.content.ActivityNotFoundException ex) {
                    Toast.makeText(getApplicationContext(), "No File-Explorer found", Toast.LENGTH_SHORT).show();
                }
            }
        }
    });

和onActivityResult:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == FILE_SELECT_CODE && resultCode == RESULT_OK && data != null) {
        Uri selectedFile = data.getData();
        try {
            byte[] sendingByte = readBytes(selectedFile);
            mBtService.send(sendingByte);
        } catch (IOException e) {
            e.printStackTrace();
            Toast.makeText(getApplicationContext(), R.string.transmissionFailed, Toast.LENGTH_SHORT).show();
        }
    }
}

readBytes函数:

    public byte[] readBytes(Uri uri) throws IOException {
    InputStream inputStream = getContentResolver().openInputStream(uri);
    ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream();
    int bufferSize = 1024;
    byte[] buffer = new byte[bufferSize];
    int len = 0;
    while ((len = inputStream.read(buffer)) != -1) {
        byteBuffer.write(buffer, 0, len);
    }
    return byteBuffer.toByteArray();
}
带有mBtService.send(sendingByte)行的

在ConnectedThread中调用以下函数:

        public void send(byte[] selectedFile) {
        try {
            mmOutStream.write(selectedFile);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

问题:
在接收器手机中我不知道如何接收字节并将其转换回文件/ uri(不知道).apk并将其保存到我的手机以使用另一个按钮执行它而不是此问题的一部分

问题:
所以我的问题是如何在接收器手机应用程序的代码中管理完成我的意图?如果我错过发布任何相关代码,我很抱歉,并将其添加到您的请求中。因为我必须为我的学习编写这两个应用程序,所以我感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

我找到了一个解决方案,将收到的字节保存到ByteArray,然后将其保存到文件中。在我的Bluetooth ConnectedThread中,我有以下run()方法:

public void run() {
        Log.i(TAG, "BEGIN mConnectedThread");
        byte[] buffer = new byte[1024];
        int len;
        ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream();
        try {
            while ((len = mmInStream.read(buffer)) != -1) {
                byteBuffer.write(buffer, 0, len);
                mHandler.obtainMessage(Constants.MESSAGE_READ, len, -1, byteBuffer.toByteArray())
                        .sendToTarget();
            }
        } catch (IOException e) {
            e.printStackTrace();
            connectionLost();
        }
    }

在我的活动中,我有以下Handler MESSAGE_READ:

private final Handler mHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        switch (msg.what) {
            case Constants.MESSAGE_STATE_CHANGE:
                ...
                break;
            case Constants.MESSAGE_READ:
                byte[] buffer = (byte[]) msg.obj;
                try {
                    String filePath = Environment.getExternalStorageDirectory() + "/download/app.apk";
                    File file = new File(filePath);
                    file.getParentFile().mkdirs();
                    if (file.exists()) {
                        file.delete();
                        file.createNewFile();
                    }
                    else
                        file.createNewFile();
                    BufferedOutputStream objectOut = new BufferedOutputStream(new FileOutputStream(file));
                    objectOut.write(buffer);
                    objectOut.close();
                    } catch (Exception e) {
                    e.printStackTrace();
                }

                break;
        }
    }
};

使用此代码,.apk将以“app.apk”保存到常规下载文件夹中。

希望这对任何人都有帮助。