在runnable android上的权限问题

时间:2017-01-24 03:43:07

标签: android multithreading permissions user-permissions

我正在尝试创建一个每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" />

2 个答案:

答案 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最初会被覆盖,因此你需要一个固定的(例如:要保存)。