<activity android:name=".opp.BluetoothOppLauncherActivity" android:process="@string/process" android:theme="@android:style/Theme.Material.Light.Dialog" android:label="@string/bt_share_picker_label" android:excludeFromRecents="true" android:configChanges="orientation|keyboardHidden|screenSize" android:enabled="@bool/profile_supported_opp"> <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="image/*" /> <data android:mimeType="video/*" /> <data android:mimeType="audio/*" /> <data android:mimeType="text/x-vcard" /> <data android:mimeType="text/x-vcalendar" /> <data android:mimeType="text/calendar" /> <data android:mimeType="text/plain" /> <data android:mimeType="text/html" /> <data android:mimeType="text/xml" /> <data android:mimeType="application/zip" /> <data android:mimeType="application/vnd.ms-excel" /> <data android:mimeType="application/msword" /> <data android:mimeType="application/vnd.ms-powerpoint" /> <data android:mimeType="application/pdf" /> <data android:mimeType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" /> <data android:mimeType="application/vnd.openxmlformats-officedocument.wordprocessingml.document" /> <data android:mimeType="application/vnd.openxmlformats-officedocument.presentationml.presentation" /> <data android:mimeType="application/x-hwp" /> <data android:mimeType="application/ogg" /> <data android:mimeType="application/mspowerpoint" /> <data android:mimeType="application/vnd.android.package-archive" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.SEND_MULTIPLE" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="image/*" /> <data android:mimeType="video/*" /> <data android:mimeType="audio/*" /> <data android:mimeType="x-mixmedia/*" /> <data android:mimeType="text/x-vcard" /> <data android:mimeType="text/x-vcalendar" /> <data android:mimeType="text/plain" /> <data android:mimeType="application/zip" /> <data android:mimeType="application/msword" /> <data android:mimeType="application/vnd.ms-excel" /> <data android:mimeType="application/vnd.ms-powerpoint" /> <data android:mimeType="application/vnd.openxmlformats-officedocument.wordprocessingml.document" /> <data android:mimeType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" /> <data android:mimeType="application/vnd.openxmlformats-officedocument.presentationml.presentation" /> <data android:mimeType="application/pdf" /> <data android:mimeType="application/ogg" /> <data android:mimeType="application/mspowerpoint" /> </intent-filter> <intent-filter> <action android:name="android.btopp.intent.action.OPEN" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="vnd.android.cursor.item/vnd.android.btopp" /> </intent-filter> </activity>
时间: 2025-07-22 13:51:13 浏览: 10
<think>我们正在讨论Android应用中配置蓝牙分享功能,特别是通过Intent Filter来响应蓝牙文件传输操作。
在Android中,蓝牙对象推送配置文件(OPP)允许应用通过蓝牙发送文件。要配置一个Activity来接收发送文件的请求,我们需要在AndroidManifest.xml中声明一个Intent Filter。
关键点:
1. 使用`android.intent.action.SEND`或`android.intent.action.SEND_MULTIPLE`来接收发送单个或多个文件的请求。
2. 设置mimeType为`*/*`以接收所有类型的文件,或者指定特定的mime类型。
3. 添加`android.intent.category.DEFAULT`类别。
示例代码:
在AndroidManifest.xml中为Activity添加intent-filter:
```xml
<activity android:name=".BluetoothShareActivity">
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="*/*" />
</intent-filter>
</activity>
```
这样,当用户尝试通过蓝牙分享文件时,我们的应用就会出现在分享列表中。
在Activity中,我们可以通过以下方式获取分享的文件:
```java
Intent intent = getIntent();
String action = intent.getAction();
String type = intent.getType();
if (Intent.ACTION_SEND.equals(action) && type != null) {
Uri fileUri = intent.getParcelableExtra(Intent.EXTRA_STREAM);
if (fileUri != null) {
// 处理文件
}
}
```
注意:从Android 7.0(API 24)开始,直接使用file:// URI可能会导致FileUriExposedException。因此,应该使用FileProvider来提供文件。
另外,要使用蓝牙功能,需要在AndroidManifest.xml中添加蓝牙权限:
```xml
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<!-- 如果需要在Android 12及以上版本使用蓝牙,还需要声明BLUETOOTH_CONNECT权限 -->
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
```
同时,对于Android 10及以上版本,还需要在代码中动态请求位置权限(因为蓝牙扫描需要位置权限),但这里我们主要是接收文件,可能不需要扫描,但根据实际需求可能需要其他权限。
以上是一个基本的配置示例。根据实际需求,可能需要处理更多细节,比如文件传输、蓝牙设备选择等。
参考文献:
[^1]: Android Developer Documentation - Bluetooth
[^2]: Android Developer Documentation - Intent Filters</think>### Android蓝牙分享功能配置指南
在Android应用中配置蓝牙分享功能(通过Object Push Profile,OPP)需要正确设置Intent Filter,使您的应用能接收蓝牙文件传输请求。以下是关键配置步骤:
#### 1. AndroidManifest.xml配置
```xml
<activity android:name=".BluetoothReceiverActivity">
<!-- 接收单文件传输 -->
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="*/*" /> <!-- 支持所有文件类型 -->
</intent-filter>
<!-- 接收多文件传输 -->
<intent-filter>
<action android:name="android.intent.action.SEND_MULTIPLE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="*/*" />
</intent-filter>
</activity>
```
#### 2. 权限声明
```xml
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<!-- Android 12+ 需要额外权限 -->
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
```
#### 3. Activity中处理接收的文件
```java
public class BluetoothReceiverActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = getIntent();
String action = intent.getAction();
String type = intent.getType();
if (Intent.ACTION_SEND.equals(action) && type != null) {
// 处理单文件
Uri fileUri = intent.getParcelableExtra(Intent.EXTRA_STREAM);
handleFile(fileUri);
}
else if (Intent.ACTION_SEND_MULTIPLE.equals(action) && type != null) {
// 处理多文件
ArrayList<Uri> fileUris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);
for (Uri uri : fileUris) {
handleFile(uri);
}
}
}
private void handleFile(Uri fileUri) {
// 实现文件处理逻辑
// 注意:Android 7.0+ 需使用FileProvider处理URI
}
}
```
#### 4. 注意事项
- **Android 7.0+文件访问**:使用`FileProvider`解决`FileUriExposedException`
```xml
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
```
- **运行时权限**:Android 6.0+需动态申请`BLUETOOTH_CONNECT`权限
- **MIME类型**:可根据需求缩小支持范围,如`image/*`仅接收图片
#### 5. 测试方法
```bash
# 通过ADB发送测试文件
adb shell am start -a android.intent.action.SEND \
-t image/jpeg -d file:///sdcard/test.jpg \
your.package.name/.BluetoothReceiverActivity
```
[^1] [^2]
阅读全文
相关推荐


















