Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android中的蓝牙文件传输_Android_File_Bluetooth_Transfer - Fatal编程技术网

Android中的蓝牙文件传输

Android中的蓝牙文件传输,android,file,bluetooth,transfer,Android,File,Bluetooth,Transfer,我正在开发一个应用程序,我需要在两台设备之间传输文件中的数据 我看过关于蓝牙聊天的教程,但不知道文件传输需要什么东西。我如何才能做到这一点?文件传输与您发送消息的方式相同。首先将文件转换为输入流,然后将其传输到已建立的设备。类似以下内容: String addr = args[0]; log("Connecting over bluetooth to " + addr); bs = null; try {

我正在开发一个应用程序,我需要在两台设备之间传输文件中的数据


我看过关于蓝牙聊天的教程,但不知道文件传输需要什么东西。我如何才能做到这一点?

文件传输与您发送消息的方式相同。首先将文件转换为输入流,然后将其传输到已建立的设备。

类似以下内容:

        String addr = args[0];
        log("Connecting over bluetooth to " + addr);

        bs = null;
        try {
            BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(addr);
            mBluetoothAdapter.cancelDiscovery();

            Method m = device.getClass().getMethod("createRfcommSocket", new Class[] {int.class});
            bs = (BluetoothSocket) m.invoke(device, Integer.valueOf(1));
            bs.connect();
        } catch (Exception e) {
            return false;
        }
您需要要连接的设备的MAC地址,然后只需使用
bs
的InputStream和OutputStream即可

Intent intent = new Intent();  
intent.setAction(Intent.ACTION_SEND);  
intent.setType("image/*");

String uri = "/mnt/sdcard/test.jpg";
intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File(uri)));
startActivity(intent);

请在您的按钮中设置此代码,并将uri设置为文件路径,然后按此按钮,您的文件将被传输。

今天,我完成了相同的任务&在花了几个小时之后,我实现了这一点。我发布了全部代码,以便其他人能够轻松理解。 这是我的活动:

package com.aqua.bluetoothfiletransfer.indragni;

import java.io.File;
import java.util.List;

import android.Manifest;
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.content.ContentUris;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.aqua.bluetoothfiletransfer.R;


public class MainActivity extends AppCompatActivity {

    private static final int DISCOVER_DURATION = 300;
    private static final int REQUEST_BLU = 1;

    String path;

    private static final String[] INITIAL_PERMS = {Manifest.permission.WRITE_EXTERNAL_STORAGE,
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.READ_CONTACTS,
            Manifest.permission.WRITE_CONTACTS,
            Manifest.permission.CAMERA,
            Manifest.permission.ACCESS_FINE_LOCATION};

    private static final int INITIAL_REQUEST = 1337;

    private static final int REQUEST_WRITE_STORAGE = INITIAL_REQUEST + 4;

    TextView textView_FileName;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_mainn);
        textView_FileName = (TextView) findViewById(R.id.textView_FileName);

        if (!canAccessLocation() || !canAccessCamera() || !canAccessWriteStorage() || !canAccessReadStorage() || !canAccessReadContacts() || !canAccessWriteContacts()) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                requestPermissions(INITIAL_PERMS, INITIAL_REQUEST);
            }
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {

        switch (requestCode) {

            case REQUEST_WRITE_STORAGE:
                if (canAccessWriteStorage()) {
                    //reload my activity with permission granted or use the features what required the permission
                    System.out.println("permission grantedddd");

                } else {
                    Toast.makeText(this, "The app was not allowed to write to your storage. Hence, it cannot function properly. Please consider granting it this permission", Toast.LENGTH_LONG).show();
                }
                break;
        }
    }

    public void sendViaBluetooth(View v) {
        if (path == null) {
            Toast.makeText(this, "Please select file first", Toast.LENGTH_SHORT).show();
            return;
        }

        BluetoothAdapter btAdapter = BluetoothAdapter.getDefaultAdapter();

        if (btAdapter == null) {
            Toast.makeText(this, "Bluetooth is not supported on this device", Toast.LENGTH_LONG).show();
        } else {
            enableBluetooth();
        }
    }

    public void getFile(View v) {
        Intent mediaIntent = new Intent(Intent.ACTION_GET_CONTENT);
        mediaIntent.setType("*/*"); //set mime type as per requirement
        startActivityForResult(mediaIntent, 1001);
    }

    public void enableBluetooth() {
        Intent discoveryIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
        discoveryIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, DISCOVER_DURATION);
        startActivityForResult(discoveryIntent, REQUEST_BLU);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        if (resultCode == DISCOVER_DURATION && requestCode == REQUEST_BLU) {

            Intent intent = new Intent();
            intent.setAction(Intent.ACTION_SEND);
            intent.setType("*/*");

            File f = new File(path);
            intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(f));

            PackageManager pm = getPackageManager();
            List<ResolveInfo> appsList = pm.queryIntentActivities(intent, 0);

            if (appsList.size() > 0) {
                String packageName = null;
                String className = null;
                boolean found = false;

                for (ResolveInfo info : appsList) {
                    packageName = info.activityInfo.packageName;
                    if (packageName.equals("com.android.bluetooth")) {
                        className = info.activityInfo.name;
                        found = true;
                        break;
                    }
                }

                if (!found) {
                    Toast.makeText(this, "Bluetooth havn't been found",
                            Toast.LENGTH_LONG).show();
                } else {
                    intent.setClassName(packageName, className);
                    startActivity(intent);
                }
            }
        } else if (requestCode == 1001
                && resultCode == Activity.RESULT_OK) {
            Uri uriPath = data.getData();
            Log.d("", "Video URI= " + uriPath);

            path = getPath(this, uriPath);// "/mnt/sdcard/FileName.mp3"
            System.out.println("pathhhh " + path);
            textView_FileName.setText(path);

        } else {
            Toast.makeText(this, "Bluetooth is cancelled", Toast.LENGTH_LONG)
                    .show();
        }
    }

    private boolean canAccessWriteStorage() {
        return (hasPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE));
    }

    private boolean canAccessReadStorage() {
        return (hasPermission(Manifest.permission.READ_EXTERNAL_STORAGE));
    }

    private boolean canAccessReadContacts() {
        return (hasPermission(Manifest.permission.READ_CONTACTS));
    }

    private boolean canAccessWriteContacts() {
        return (hasPermission(Manifest.permission.WRITE_CONTACTS));
    }

    private boolean canAccessCamera() {
        return (hasPermission(Manifest.permission.CAMERA));
    }

    private boolean canAccessLocation() {
        return (hasPermission(Manifest.permission.ACCESS_FINE_LOCATION));
    }

    private boolean hasPermission(String perm) {
        return (PackageManager.PERMISSION_GRANTED == ContextCompat.checkSelfPermission(this, perm));
    }

    public static String getPath(final Context context, final Uri uri) {
        final boolean isKitKatOrAbove = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;

        // DocumentProvider
        if (isKitKatOrAbove && DocumentsContract.isDocumentUri(context, uri)) {
            // ExternalStorageProvider
            if (isExternalStorageDocument(uri)) {
                final String docId = DocumentsContract.getDocumentId(uri);
                final String[] split = docId.split(":");
                final String type = split[0];

                if ("primary".equalsIgnoreCase(type)) {
                    return Environment.getExternalStorageDirectory() + "/" + split[1];
                }

                // TODO handle non-primary volumes
            }
            // DownloadsProvider
            else if (isDownloadsDocument(uri)) {

                final String id = DocumentsContract.getDocumentId(uri);
                final Uri contentUri = ContentUris.withAppendedId(
                        Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));

                return getDataColumn(context, contentUri, null, null);
            }
            // MediaProvider
            else if (isMediaDocument(uri)) {
                final String docId = DocumentsContract.getDocumentId(uri);
                final String[] split = docId.split(":");
                final String type = split[0];

                Uri contentUri = null;
                if ("image".equals(type)) {
                    contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
                } else if ("video".equals(type)) {
                    contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
                } else if ("audio".equals(type)) {
                    contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
                }

                final String selection = "_id=?";
                final String[] selectionArgs = new String[]{
                        split[1]
                };

                return getDataColumn(context, contentUri, selection, selectionArgs);
            }
        }
        // MediaStore (and general)
        else if ("content".equalsIgnoreCase(uri.getScheme())) {
            return getDataColumn(context, uri, null, null);
        }
        // File
        else if ("file".equalsIgnoreCase(uri.getScheme())) {
            return uri.getPath();
        }

        return null;
    }

    /**
     * Get the value of the data column for this Uri. This is useful for
     * MediaStore Uris, and other file-based ContentProviders.
     *
     * @param context       The context.
     * @param uri           The Uri to query.
     * @param selection     (Optional) Filter used in the query.
     * @param selectionArgs (Optional) Selection arguments used in the query.
     * @return The value of the _data column, which is typically a file path.
     */
    public static String getDataColumn(Context context, Uri uri, String selection,
                                       String[] selectionArgs) {

        Cursor cursor = null;
        final String column = "_data";
        final String[] projection = {
                column
        };

        try {
            cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,
                    null);
            if (cursor != null && cursor.moveToFirst()) {
                final int column_index = cursor.getColumnIndexOrThrow(column);
                return cursor.getString(column_index);
            }
        } finally {
            if (cursor != null)
                cursor.close();
        }
        return null;
    }


    /**
     * @param uri The Uri to check.
     * @return Whether the Uri authority is ExternalStorageProvider.
     */
    public static boolean isExternalStorageDocument(Uri uri) {
        return "com.android.externalstorage.documents".equals(uri.getAuthority());
    }

    /**
     * @param uri The Uri to check.
     * @return Whether the Uri authority is DownloadsProvider.
     */
    public static boolean isDownloadsDocument(Uri uri) {
        return "com.android.providers.downloads.documents".equals(uri.getAuthority());
    }

    /**
     * @param uri The Uri to check.
     * @return Whether the Uri authority is MediaProvider.
     */
    public static boolean isMediaDocument(Uri uri) {
        return "com.android.providers.media.documents".equals(uri.getAuthority());
    }

}
package com.aqua.bluetoothfiletransfer.indragni;
导入java.io.File;
导入java.util.List;
导入android.Manifest;
导入android.app.Activity;
导入android.bluetooth.BluetoothAdapter;
导入android.content.ContentUris;
导入android.content.Context;
导入android.content.Intent;
导入android.content.pm.PackageManager;
导入android.content.pm.ResolveInfo;
导入android.database.Cursor;
导入android.net.Uri;
导入android.os.Build;
导入android.os.Bundle;
导入android.os.Environment;
导入android.provider.documents合同;
导入android.provider.MediaStore;
导入android.support.v4.content.ContextCompat;
导入android.support.v7.app.ActionBarActivity;
导入android.support.v7.app.AppActivity;
导入android.util.Log;
导入android.view.view;
导入android.widget.Button;
导入android.widget.TextView;
导入android.widget.Toast;
导入com.aqua.bluetoothfiletransfer.R;
公共类MainActivity扩展了AppCompatActivity{
专用静态最终int DISCOVER_持续时间=300;
私有静态最终整数请求_BLU=1;
字符串路径;
私有静态最终字符串[]INITIAL_PERMS={Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_外部存储,
Manifest.permission.READ_联系人,
Manifest.permission.WRITE_联系人,
舱单,许可,摄像机,
Manifest.permission.ACCESS\u FINE\u LOCATION};
私有静态最终int初始_请求=1337;
私有静态最终整数请求\写入\存储=初始\请求+4;
TextView TextView_文件名;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u main);
textView_FileName=(textView)findViewById(R.id.textView_FileName);
如果(!canAccessLocation()| | |!canAccessCamera()| |!canAccessWriteStorage()| |!canAccessReadStorage()| |!canAccessReadContacts()| |!canAccessWriteContacts()){
if(Build.VERSION.SDK\u INT>=Build.VERSION\u code.M){
请求权限(初始权限、初始请求);
}
}
}
@凌驾
public void onRequestPermissionsResult(int-requestCode、字符串[]权限、int[]grantResults){
开关(请求代码){
案例请求\写入\存储:
如果(canAccessWriteStorage()){
//在授予权限的情况下重新加载“我的活动”,或使用需要权限的功能
System.out.println(“许可授予的DDD”);
}否则{
TaST.MaKEXTEST(这是“应用程序不允许写入您的存储区。因此,它不能正常工作。请考虑授予它这个权限”,toAST.LangthyLon)。
}
打破
}
}
通过蓝牙发送的公共数据(视图v){
if(路径==null){
Toast.makeText(这是“请先选择文件”,Toast.LENGTH_SHORT.show();
返回;
}
BluetoothAdapter btAdapter=BluetoothAdapter.getDefaultAdapter();
if(btAdapter==null){
Toast.makeText(此“此设备不支持蓝牙”,Toast.LENGTH_LONG.show();
}否则{
启用蓝牙();
}
}
公共void getFile(视图v){
Intent mediaIntent=新的意图(Intent.ACTION\u GET\u CONTENT);
mediaIntent.setType(“*/*”);//根据需要设置mime类型
startActivityForResult(mediaIntent,1001);
}
public void enableBluetooth(){
意向发现内容=新意向(BluetoothAdapter.ACTION\u REQUEST\u DISCOVERABLE);
discoveryIntent.putExtra(BluetoothAdapter.EXTRA\u DISCOVERABLE\u DURATION,discovery\u DURATION);
startActivityForResult(发现内容、请求);
}
@凌驾
受保护的void onActivityResult(int请求代码、int结果代码、意图数据){
if(resultCode==DISCOVER\u DURATION&&requestCode==REQUEST\u BLU){
意图=新意图();
intent.setAction(intent.ACTION\u SEND);
intent.setType(“*/*”);
文件f=新文件(路径);
intent.putExtra(intent.EXTRA_流,Uri.fromFile(f));
PackageManager pm=getPackageManager();
List-appsList=pm.querytentActivities(intent,0);
如果(appsList.size()>0){
字符串packageName=null;
字符串className=null;
布尔值=false;
用于(ResolveInfo:appsList){
packageName=info.activityInfo.packageName;
if(packageName.equals(“com.android.bluetooth”)){
className=info.activityInfo.name;
发现=真;
打破
}
}
如果(!找到){
Toast.makeText(此“蓝牙尚未找到”,
Toast.LENGTH_LONG).show();
}否则{
intent.setClassName(packageName,cl
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    android:orientation="vertical">

    <TextView
        android:id="@+id/textView_FileName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="50dp"
        android:text="Please select file"
        android:textSize="18sp" />


    <Button
        android:id="@+id/button_GetFile"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="getFile"
        android:text="Get file from device" />

    <Button
        android:id="@+id/button_SendFile"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="sendViaBluetooth"
        android:text="Send via Bluetooth" />

</LinearLayout>
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.INTERNET" />