gpt4 book ai didi

Android 蓝牙打印在 4.1 上停止工作

转载 作者:行者123 更新时间:2023-11-29 14:53:15 25 4
gpt4 key购买 nike

我们有一个应用程序可以将图像打印到蓝牙打印机。此应用程序在 Android 4.0 ICS 上运行良好,但当我们将其中一个升级到 Android 4.1 果冻 bean 时,打印在 logcat 中停止使用此应用程序:

W/System.err(19319): java.lang.SecurityException: Permission Denial: writing com.android.bluetooth.opp.BluetoothOppProvider uri content://com.android.bluetooth.opp/btopp from pid=19319, uid=10106 requires android.permission.ACCESS_BLUETOOTH_SHARE, or grantUriPermission()

问题是我们正在声明该权限,所以这个错误对我们来说毫无意义。这是我们 list 中的行

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.turner.itstrategy.LumenboxClient"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk android:minSdkVersion="11" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.ACCESS_BLUETOOTH_SHARE"/>
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.VIBRATE" />

(stuff removed)
</manifest>

这是我们用来打印的代码。此代码取自 stackoverflow 和其他地方的示例。

ContentValues values = new ContentValues();

String path = Environment.getExternalStorageDirectory().toString();
File imageFile = new File(path, "CurrentLumenboxPrint.jpg");

//build the message to send on BT
values.put(BluetoothShare.URI, Uri.fromFile(imageFile).toString());
values.put(BluetoothShare.MIMETYPE, "image/jpeg");
values.put(BluetoothShare.DESTINATION, device.getAddress());
values.put(BluetoothShare.DIRECTION, BluetoothShare.DIRECTION_OUTBOUND);
Long ts = System.currentTimeMillis();
values.put(BluetoothShare.TIMESTAMP, ts);

// Here is where the exception happens
final Uri contentUri = getApplicationContext().getContentResolver().insert(BluetoothShare.CONTENT_URI, values);

现在我们已经死在水里了..任何建议表示赞赏。

最佳答案

发现这将不再适用于 4.1。直接写入内容提供者的权限现在受到“已签名”的保护,这意味着您必须使用与蓝牙应用程序签名相同的 key 对您的应用程序进行签名。

这就是我们最终的做法。首先使用分享 Intent 将其直接发送到应用程序:

Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND);
sharingIntent.setType("image/jpeg");
sharingIntent.setComponent(new ComponentName("com.android.bluetooth", "com.android.bluetooth.opp.BluetoothOppLauncherActivity"));
sharingIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(imageFile));
startActivity(sharingIntent);

这行得通,但它会弹出“选择设备”用户界面。如果你不希望你必须处理 Intent android.bluetooth.devicepicker.action.LAUNCH 并响应广播消息 android.bluetooth.devicepicker.action.DEVICE_SELECTED。但是用户仍然可以获得选择器弹出窗口。

更新:我写了一个blog post以及如何执行此操作的完整说明。

关于Android 蓝牙打印在 4.1 上停止工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12388503/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com