我正在尝试创建一个每10秒运行一次的服务来检查队列,如果队列中有一些数据,则将给定的uri(刚从应用程序中取出的图片)上传到某个URL。
我在这些方面创造了一些东西
public QueueProcessor(final Context context){
this.mContext = context.getApplicationContext();
}
/**
* Starts processing the items on a separate thread.
*/
public void process() {
Runnable running = new Runnable() {
@Override
public void run() {
try{
Log.i(RUN_QP_TAG, "Processing queue");
// more here
isRunning = true;
Queue theQ = Queue.getInstance();
if(theQ.getSize() > 0){
WorkQItem itm = theQ.pop();
if(itm.hasImage()){
pushImageUploadToProcess(itm);
}
}
} catch (Exception e) {
// TODO: handle exception
}
finally{
//also call the same runnable to call it at regular interval
handler.postDelayed(this, 10000);
}
}
};
new Thread(running).start();
}
pushImageUploadToProcess接受WorkQItem并尝试通过打开uri并写入字节来从项目(保存为String picUri)上传图像。但是,在尝试打开picUri位置时,我收到了权限被拒绝的异常。
MediaDocumentsProvider uri content://com.android.providers.media.documents/document/image%3A531 from pid=795, uid=10327 requires android.permission.MANAGE_DOCUMENTS, or grantUriPermission()
如何允许此Thread / Runnable访问URI? 注意我已经尝试直接从按钮事件上传,它确实有效。
我在清单中有以下权限:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PROFILE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_DOCUMENTS" />
答案 0 :(得分:2)
您应该为代码
下面的用法实现运行时权限PermissionsManager.getInstance().requestAllManifestPermissionsIfNecessary(this, new PermissionsResultAction() {
@Override
public void onGranted() {
// Proceed with initialization
}
@Override
public void onDenied(String permission) {
// Notify the user that you need all of the permissions
}
});
在您的应用程序gradle中添加以下依赖项
compile 'com.anthonycr.grant:permissions:1.0'
答案 1 :(得分:0)
看起来实际的权限错误不是真正的问题。真正的问题是我选择和选择图像的方式。 我最终使用https://gist.github.com/Mariovc/f06e70ebe8ca52fbbbe2这个选择器,似乎没有任何问题。 我稍微调整了这段代码以满足我的需要,因为从相机中挑选的任何图像都需要保存,以便如果有多个图像被完成并且每个图像都需要以后使用,相关的uri最初会被覆盖,因此你需要一个固定的(例如:要保存)。