runnable 的权限问题 android

Permission issue on runnable android

我正在尝试提供一项服务,每 10 秒 运行 检查队列,如果队列中有一些数据,则上传给定的 uri(刚从应用程序中拍摄的照片的 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 并写入字节从项目(保存为字符串 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" />

您应该实现运行时权限,以便在代码下方使用

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'

看来实际的权限错误并不是真正的问题。真正的问题是我选择和挑选图像的方式。 我最终使用了 https://gist.github.com/Mariovc/f06e70ebe8ca52fbbbe2 这个选择器,它似乎没有任何问题。 我稍微调整了这段代码以满足我的需要,因为从相机中拾取的任何图像也需要保存,这样如果有多个图像正在完成并且每个图像都需要稍后使用,相对 uri 最初将被覆盖因此你需要一个固定一个(例如:待保存)。