文档章节

libusb_init失败及open failed (Permission denied)

 山里来的鱼
发布于 2016/03/03 16:52
字数 555
阅读 1724
收藏 0
点赞 1
评论 0

参考http://stackoverflow.com/questions/25662307/android-l-libusb-init-returns-libusb-error-other-99

http://stackoverflow.com/questions/8854359/exception-open-failed-eacces-permission-denied-on-android

http://www.freehum.com/2014/06/operate-usb-device-under-android-by-libusb-without-root.html

在将原来的程序(Android 4.x)部署到Android 5.0和6.0的时候,遇到libusb_init失败和open failed (Permission denied)的错误,Google之后,发现是权限问题。

libusb_init失败(error -99)

Android 5.0之后强制开启了Selinux:

  • Android sandbox reinforced with SELinux. Android now requires SELinux in enforcing mode for all domains. SELinux is a mandatory access control (MAC) system in the Linux kernel used to augment the existing discretionary access control (DAC) security model. This new layer provides additional protection against potential security vulnerabilities.

详见https://source.android.com/security/enhancements/enhancements50.html

解决办法有2种

  1. 安装SELinuxModeChanger,将模式改为permissive —— 貌似需要root

  2. 修改libusb,stackoverflow上说如下2个链接已经fix了:https://github.com/martinmarinov/rtl_tcp_andro-https://github.com/Gritzman/libusb

  3. 本人使用的https://github.com/Gritzman/libusb

另外,可能需要增加libusb_open_fd,编译之后的so见http://pan.baidu.com/s/1hrzAfZ2

1) core.c 中在 libusb_open 后面增加 libusb_open_fd 函数

int API_EXPORTED libusb_open_fd(libusb_device *dev, libusb_device_handle **handle, int fd)
{
	struct libusb_context *ctx = DEVICE_CTX(dev);
	struct libusb_device_handle *_handle;
	size_t priv_size = usbi_backend->device_handle_priv_size;
	int r;
	usbi_dbg("open %d.%d", dev->bus_number, dev->device_address);

	_handle = malloc(sizeof(*_handle) + priv_size);
	if (!_handle)
		return LIBUSB_ERROR_NO_MEM;

	r = usbi_mutex_init(&_handle->lock, NULL);
	if (r) {
		free(_handle);
		return LIBUSB_ERROR_OTHER;
	}

	_handle->dev = libusb_ref_device(dev);
	_handle->claimed_interfaces = 0;
	memset(&_handle->os_priv, 0, priv_size);

	r = usbi_backend->open_fd(_handle, fd);
	if (r < 0) {
		usbi_dbg("open %d.%d returns %d", dev->bus_number, dev->device_address, r);
		libusb_unref_device(dev);
		usbi_mutex_destroy(&_handle->lock);
		free(_handle);
		return r;
	}

	usbi_mutex_lock(&ctx->open_devs_lock);
	list_add(&_handle->list, &ctx->open_devs);
	usbi_mutex_unlock(&ctx->open_devs_lock);
	*handle = _handle;

/* At this point, we want to interrupt any existing event handlers so
 * that they realise the addition of the new device's poll fd. One
 * example when this is desirable is if the user is running a separate
 * dedicated libusb events handling thread, which is running with a long
 * or infinite timeout. We want to interrupt that iteration of the loop,
 * so that it picks up the new fd, and then continues. */
	usbi_fd_notification(ctx);

	return 0;
}

2) os/linux_usbfs.c 中在 op_open 后面增加 op_open_fd 函数

static int op_open_fd(struct libusb_device_handle *handle, int fd) {
	struct linux_device_handle_priv *hpriv = _device_handle_priv(handle);

	hpriv->fd = fd;

	return usbi_add_pollfd(HANDLE_CTX(handle), hpriv->fd, POLLOUT);
}

3)os/linux_usbfs.c中.open = op_open,后添加.open_fd = op_open_fd,

4) 在libusbi.h中,

int (*open)(struct libusb_device_handle *handle);

后添加

int (*open_fd)(struct libusb_device_handle *handle, int fd);

'open failed: EACCES (Permission denied)' 

API 23(6.0)之后,需要请求读写外设权限

private static final int REQUEST_EXTERNAL_STORAGE = 1;
private static String[] PERMISSIONS_STORAGE = {
        Manifest.permission.READ_EXTERNAL_STORAGE,
        Manifest.permission.WRITE_EXTERNAL_STORAGE
};
//在需要读写外设的地方
int permission = checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE);

    if (permission != PackageManager.PERMISSION_GRANTED) {
        // We don't have permission so prompt the user
        requestPermissions(PERMISSIONS_STORAGE,REQUEST_EXTERNAL_STORAGE);
    }


© 著作权归作者所有

共有 人打赏支持
粉丝 6
博文 156
码字总数 28874
作品 0
珠海
程序员
关于apache2在linux启动命令的疑问

coat@Blue :~$ apache2ctl restart /usr/sbin/apache2ctl: 87: ulimit: error setting limit (Operation not permitted) httpd not running, trying to start (13)Permission denied: make_s......

coat ⋅ 2013/12/08 ⋅ 8

ThinkPHP入门 Linux 下 Composer的安装出现如下错误如何解决

问题描述:学习thinphp入门问当时出现如下错误。教程中说明linux and mac 使用如下命令安装(我使用的Linux Deepin2015.1.1+php5.6): curl -sS https://getcomposer.org/installer | php mv ...

viowin ⋅ 2016/05/06 ⋅ 2

http启动时提示如下错误Permission denied

apache配置了多端口,启动时提示如下错误,原因是selinux开启导致 [root@zabbix-server-155 conf]# /etc/init.d/httpd start Starting httpd: [Tue Dec 20 11:34:44 2016] [warn] NameVirtu......

全村人希望 ⋅ 2016/12/20 ⋅ 0

CentOS 7 Nginx 错误集合

「个人记录,肯定有理解错误和理解不透的地方,小白总是有个成长的过程,希望大家多多指教。」 「下面的一些错误也只是自己遇到的低级错误,在大神眼里也许都是常识,求指导,^_^」 Nginx 错...

刘草 ⋅ 2015/06/24 ⋅ 2

安装ECShop出错

Warning: sessionstart(): open(/var/lib/php/session/sessh90sjunlk2m700v35lga1d1h00, ORDWR) failed: Permission denied (13) in /data/www/ECShopV3.0.0UTF8release0518/install/index.p......

小崔st ⋅ 2016/10/20 ⋅ 0

svnmanager安装后不能打开问题,提示Fatal Error

启动SVNmanager时提示如下信息,已经在passwd中提升了apache用户的权限为root权限,你有解决方法吗?谢谢: Fatal Error [2] session_start() [function.session-start]: open(/var/lib/php/...

水中缘 ⋅ 2012/02/24 ⋅ 0

linux下安装git常见故障整理

FAQ 1: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password). [root@testss git]# git clone git@192.168.1.200:testone.git正克隆到 'testone'...git@192.168.1.200's pa......

812374156 ⋅ 03/21 ⋅ 0

OpenLDAP服务启动不了

启动ldap服务: $ ./slapd -d 256: 50989114 daemon: bind(6) failed errno=13 (Permission denied) 50989114 daemon: IPv6 socket() failed errno=97 (Address family not supported by p......

藍色的海 ⋅ 2012/11/06 ⋅ 2

centos6中yum安装nginx

第一步,在/etc/yum.repos.d/目录下创建一个源配置文件nginx.repo: cd /etc/yum.repos.d/ vim nginx.repo 填写如下内容: [nginx] name=nginx repo baseurl=http://nginx.org/packages/cent......

chaun ⋅ 2016/03/08 ⋅ 0

Zabbix mstmp+Mutt发邮件注意权限

root@tw-mtj-223:~# su zabbix $ $ cd ^H^H^H^H^C $ echo "test"|mutt -s "test" sasas@qq.com msmtp: authentication failed (method LOGIN) msmtp: server message: 550 User has no permi......

ShuaiDing ⋅ 2015/07/23 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spring MVC基本概念

只写Controller

颖伙虫 ⋅ 14分钟前 ⋅ 0

微软重金收购GitHub的背后逻辑原来是这样的

全球最大的开发者社区GitHub网站花落谁家的问题已经敲定,微软最终以75亿美元迎娶了这位在外界看来无比“神秘”的小家碧玉。尽管此事已过去一些时日,但整个开发者世界,包括全球各地的开源社...

linux-tao ⋅ 14分钟前 ⋅ 0

磁盘管理—逻辑卷lvm

4.10-4.12 lvm 操作流程: 磁盘分区-->创建物理卷-->划分为卷组-->划分成逻辑卷-->格式化、挂载-->扩容。 磁盘分区 注: 创建分区时需要更改其文件类型为lvm(代码8e) 分区 3 已设置为 Linu...

弓正 ⋅ 34分钟前 ⋅ 0

Spring源码解析(六)——实例创建(上)

前言 经过前期所有的准备工作,Spring已经获取到需要创建实例的 beanName 和对应创建所需要信息 BeanDefinition,接下来就是实例创建的过程,由于该过程涉及到大量源码,所以将分为多个章节进...

MarvelCode ⋅ 54分钟前 ⋅ 0

js模拟栈和队列

栈和队列 栈:LIFO(先进后出)一种数据结构 队列:LILO(先进先出)一种数据结构 使用的js方法 1.push();可以接收任意数量的参数,把它们逐个推进队尾(数组末尾),并返回修改后的数组长度。 2....

LIAOJIN1 ⋅ 今天 ⋅ 0

180619-Yaml文件语法及读写小结

Yaml文件小结 Yaml文件有自己独立的语法,常用作配置文件使用,相比较于xml和json而言,减少很多不必要的标签或者括号,阅读也更加清晰简单;本篇主要介绍下YAML文件的基本语法,以及如何在J...

小灰灰Blog ⋅ 今天 ⋅ 0

IEC60870-5-104规约传送原因

1:周期循环2:背景扫描3:自发4:初始化5:请求6:激活7:激活确认8:停止激活9:停止激活确认10:激活结束11:远程命令引起的返送信息12:当地命令引起的返送信息13:文件传送20:响应总召...

始终初心 ⋅ 今天 ⋅ 0

【图文经典版】冒泡排序

1、可视化排序过程 对{ 6, 5, 3, 1, 8, 7, 2, 4 }进行冒泡排序的可视化动态过程如下 2、代码实现    public void contextLoads() {// 冒泡排序int[] a = { 6, 5, 3, 1, 8, 7, 2, ...

pocher ⋅ 今天 ⋅ 0

ORA-12537 TNS-12560 TNS-00530 ora-609解决

oracle 11g不能连接,卡住,ORA-12537 TNS-12560 TNS-00530 TNS-12502 tns-12505 ora-609 Windows Error: 54: Unknown error 解决方案。 今天折腾了一下午,为了查这个问题。。找了N多方案,...

lanybass ⋅ 今天 ⋅ 0

IDEA反向映射Mybatis

1.首先在pom文件的plugins中添加maven对mybatis-generator插件的支持 ` <!-- mybatis逆向工程 --><plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-ma......

lichengyou20 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部