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 最初将被覆盖因此你需要一个固定一个(例如:待保存)。
我正在尝试提供一项服务,每 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 最初将被覆盖因此你需要一个固定一个(例如:待保存)。