文档章节

libusb_init失败及open failed (Permission denied)

 山里来的鱼
发布于 2016/03/03 16:52
字数 555
阅读 1808
收藏 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);
    }


© 著作权归作者所有

共有 人打赏支持
粉丝 7
博文 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
1K
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
820
2
svnmanager安装后不能打开问题,提示Fatal Error

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

水中缘
2012/02/24
997
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
0
【WordPress】CentOS 6.10 测试WP发送邮件失败

1、错误信息如下:   SMTP -> ERROR: Failed to connect to server: Permission denied (13) 2、解决方法:   https://gistpages.com/posts/phpmailersmtperrorfailedtoconnecttoserver......

FeCodeTech
08/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

如何通过 J2Cache 实现分布式 session 存储

做 Java Web 开发的人多数都会需要使用到 session (会话),我们使用 session 来保存一些需要在两个不同的请求之间共享数据。一般 Java 的 Web 容器像 Tomcat、Resin、Jetty 等等,它们会在...

红薯
今天
3
0
C++ std::thread

C++11提供了std::thread类来表示一个多线程对象。 1,首先介绍一下std::this_thread命名空间: (1)std::this_thread::get_id():返回当前线程id (2)std::this_thread::yield():用户接口...

yepanl
今天
3
0
Nignx缓存文件与动态文件自动均衡的配置

下面这段nginx的配置脚本的作用是,自动判断是否存在缓存文件,如果有优先输出缓存文件,不经过php,如果没有,则回到php去处理,同时生成缓存文件。 PHP框架是ThinkPHP,最后一个rewrite有关...

swingcoder
今天
2
0
20180920 usermod命令与用户密码管理

命令 usermod usermod 命令的选项和 useradd 差不多。 一个用户可以属于多个组,但是gid只有一个;除了gid,其他的组(groups)叫做扩展组。 usermod -u 1010 username # 更改用户idusermod ...

野雪球
今天
3
0
Java网络编程基础

1. 简单了解网络通信协议TCP/IP网络模型相关名词 应用层(HTTP,FTP,DNS等) 传输层(TCP,UDP) 网络层(IP,ICMP等) 链路层(驱动程序,接口等) 链路层:用于定义物理传输通道,通常是对...

江左煤郎
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部