我onActivityResult从mediastore图像选择返回,我可以使用以下内容获取图像的URI:
Uri selectedImage = data.getData();
Run Code Online (Sandbox Code Playgroud)
将其转换为字符串可以得到:
content://media/external/images/media/47
Run Code Online (Sandbox Code Playgroud)
或者路径给出:
/external/images/media/47
Run Code Online (Sandbox Code Playgroud)
但是我似乎无法找到将其转换为绝对路径的方法,因为我想将图像加载到位图而不必将其复制到某处.我知道这可以使用URI和内容解析器完成,但这似乎在重新启动手机时中断,我想MediaStore在重新启动之间不会保持其编号相同.
我创建了一个包含GWVectraNotifier活动的应用程序,该活动从其他应用程序调用以显示通知.
在"通知"对话框中,将显示"显示"按钮和"关闭"按钮.
单击"显示"按钮,将启动相应的活动.
要检查上述应用程序的功能,
我在checkmail事件触发器上从K9Mail应用程序启动了GWVectraNotifier活动.
我能够成功启动GWVectraNotifier活动,但是点击'show'按钮我将不得不启动K9mail的'MessageList'活动.为此,我编写了以下代码:
Intent i = new Intent();
i.setComponent(new ComponentName("com.fsck.k9", "com.fsck.k9.activity.MessageList"));
i.putExtra("account", accUuid);
i.putExtra("folder", accFolder);
startActivity(i);
Run Code Online (Sandbox Code Playgroud)
抛出:
WARN/ActivityManager(59): Permission denied: checkComponentPermission() reqUid=10050
WARN/ActivityManager(59): Permission Denial: starting Intent { cmp=com.fsck.k9/.activity.MessageList (has extras) } from ProcessRecord{43f6d7c8 675:com.i10n.notifier/10052} (pid=675, uid=10052) requires null
WARN/System.err(675): java.lang.SecurityException: Permission Denial: starting Intent { cmp=com.fsck.k9/.activity.MessageList (has extras) } from ProcessRecord{43f6d7c8 675:com.i10n.notifier/10052} (pid=675, uid=10052) requires null
WARN/System.err(675): at android.os.Parcel.readException(Parcel.java:1247)
WARN/System.err(675): at android.os.Parcel.readException(Parcel.java:1235)
WARN/System.err(675): at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:1298)
WARN/System.err(675): at android.app.Instrumentation.execStartActivity(Instrumentation.java:1373)
WARN/System.err(675): at android.app.Activity.startActivityForResult(Activity.java:2817)
WARN/System.err(675): at android.app.Activity.startActivity(Activity.java:2923)
WARN/System.err(675): at …Run Code Online (Sandbox Code Playgroud) java.lang.SecurityException:权限拒绝:从ProcessRecord打开提供程序com.android.providers.media.MediaDocumentsProvider {430b1748 29271:com.xxx/u0a88}(pid = 29271,uid = 10088)需要android.permission.MANAGE_DOCUMENTS或android. permission.MANAGE_DOCUMENTS
我已添加MANAGE_DOCUMENTS和READ_EXTERNAL_STORAGE权限,但我仍然收到此错误.违规代码:
public static String getImagePath(HailoDriverApplication app, Uri uri) {
Cursor cursor = null;
if (uri == null) {
return null;
}
try {
cursor = app.getContentResolver().query(uri, new String[] {
MediaStore.Images.Media.DATA
}, null, null, null);
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
if (cursor.moveToFirst()) {
return cursor.getString(column_index);
}
} finally {
if (cursor != null) {
cursor.close();
}
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
正如所要求的清单片段:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.x.x.x" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="16" /> …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个简单的应用程序,可以从Gallery应用程序获取图像并将其显示在imageButton上.我在运行Android 5.0.1的手机上使用API 21进行测试.不幸的是,无论我尝试什么,我都会遇到安全错误 - 即使我指定了权限.
我获取图像的代码是:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent){
super.onActivityResult(requestCode, resultCode, imageReturnedIntent);
switch(requestCode){
case PICK_IMAGE_REQUEST:
if(resultCode == RESULT_OK && imageReturnedIntent != null && imageReturnedIntent.getData() != null) {
Uri uri = imageReturnedIntent.getData();
try {
Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), uri);
// Log.d(TAG, String.valueOf(bitmap));
ImageButton ib = (ImageButton) findViewById(R.id.inputImg);
ib.setImageBitmap(bitmap);
} catch (IOException e) {
e.printStackTrace();
}
}
break;
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试从Dropbox中选择图像时代码有效,但是当我从图库中选择图像时,我得到了
java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/images/media/35634 from pid=25240, uid=10070 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission()
Run Code Online (Sandbox Code Playgroud)
我为READ_EXTERNAL_STORAGE制作了一个使用权限标记: …
java android android-gallery android-permissions android-5.0-lollipop
我想仅为旧设备提供一些权限以实现兼容性.所以我做了一些研究,发现这里:
android:maxSdkVersion
应授予应用程序此权限的最高API级别.如果从某个API级别开始不再需要您的应用所需的权限,则设置此属性非常有用.例如,从Android 4.4(API级别19)开始,当您的应用想要写入外部存储上自己的应用程序特定目录(getExternalFilesDir()提供的目录)时,您的应用不再需要请求WRITE_EXTERNAL_STORAGE权限.但是,API级别18及更低级别需要权限.因此,您可以声明此权限仅在API级别18之前需要,声明如下:
Run Code Online (Sandbox Code Playgroud)<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="18" />
我试图实现它,但它没有用.所以我建立了这个简单的测试:
<uses-permission
android:name="android.permission.WRITE_SMS"
android:maxSdkVersion="3" />
Run Code Online (Sandbox Code Playgroud)
据我所知,只有API级别为1-3的设备才需要此权限,但即使在API 18设备上,我也会收到此权限请求.我有什么不对或者这个功能坏了吗?
我有一个活动,有一个浏览器按钮,然后一个imageview,希望用户看到他们上传的内容,但每次选择什么图像想要"上传"我正在采取错误"没有回应"...虽然我已经把清单中的权限...
错误日志(logcat)
12-10 03:55:39.459 5357-5357/com.holomedia.holomedia E/AndroidRuntime:FATAL EXCEPTION:main进程:com.holomedia.holomedia,PID:5357 java.lang.RuntimeException:传递结果失败ResultInfo {who = null ,request = 1,result = -1,data = Intent {dat = content:// media/external/images/media/39}} to activity {com.holomedia.holomedia/com.holomedia.holomedia.Add_video}:java .lang.SecurityException:Permission Denial:从pid = 5357读取com.android.providers.media.MediaProvider uri content:// media/external/images/media/39,uid = 10060需要android.permission.READ_EXTERNAL_STORAGE或grantUriPermission( )android.app.A活动时,Android.app.ActivityThread.handleSendResult(ActivityThread.java:3742)的android.app.ActivityThread.deliverResult(ActivityThread.java:3642)处于android.app.A活动时,在android.app.ActivityThread.-wrap16(ActivityThread.java)处. ActivityThread $ H.handleMessage(ActivityThread.java:1393)在android.app.Handler.dispatchMessage(Handler.java:102)android.app.Looper.loop(Looper.java:148)android.app .ActivityThread.main(ActivityThread.java:5417)位于com.android的com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:726)的java.lang.reflect.Method.invoke(Native Method) .internal.os.ZygoteInit.main(ZygoteInit.java:616)引起:java.lang.SecurityException:Permission Denial:读取com.android.providers.media.MediaProvider uri content:// media/external/images/media/39来自pid = 5357,uid = 10060需要android.permission.READ_EXTERNAL_STORAGE,或android.ex.Dex上的androidA.D.Pexcel.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:183)的android.os.Parcel.readException(Parcel.java:1599)中的grantUriPermission()在Android.content的android.content.ContentResolver.query(ContentResolver.java:491)的android.content.ContentProviderProxy.query(ContentProviderNative.java:421)的android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135)处. ContentResolver.query(ContentResolver.java:434)at com.holomedia.holomedia.Add_video.onActivityResult(Add_video.java:48)在Android.app.A活动中,android.app.ActivityThread.deliverResult(ActivityThread.java:3695)的android.app.ActivityThread.deliverResult(ActivityThread.java:3695)的android.app.Activity.dispatchActivityResult(Activity.java:6428). android.app.Handler.dispatchMessage(Handler.java:102)上android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1393)的ActivityThread.-wrap16(ActivityThread.java)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Run Code Online (Sandbox Code Playgroud)
...我的xml代码:
"<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ImageView
android:id="@+id/imgView"
android:layout_width="fill_parent"
android:layout_height="462dp" …Run Code Online (Sandbox Code Playgroud)