我的应用程序可以从库中选择照片.我想要从这个选择中获取文件路径.
这是创建选择照片的意图的代码:
Intent photoPickerIntent = new Intent(Intent.ACTION_PICK,
MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
photoPickerIntent.setType("image/*");
startActivityForResult(photoPickerIntent, INTENT_REQUEST_CODE_SELECT_PHOTO);
Run Code Online (Sandbox Code Playgroud)
这是从URI获取文件路径的代码:
Cursor cursor = null;
String path = null;
try {
String[] projection = { MediaStore.Images.Media.DATA };
cursor = context.getContentResolver().query(contentUri, projection, null, null, null);
int columnIndex = cursor.getColumnIndexOrThrow(projection[0]);
cursor.moveToFirst();
path = cursor.getString(columnIndex);
} finally {
if (cursor != null) {
cursor.close();
}
}
return path;
Run Code Online (Sandbox Code Playgroud)
在昨天更新Google相册应用之前,一切都运转良好.path解析URI后现在为null.
URI类似于: content://com.google.android.apps.photos.contentprovider/0/1/content%3A%2F%2Fmedia%2Fexternal%2Fimages%2Fmedia%2F75209/ACTUAL
我还试图用Intent.ACTION_GET_CONTENT动作创建意图 - 没有运气.
突然间,我开始从运行android 4.3及更高版本的设备获得以下异常
java.lang.SecurityException: Permission Denial: opening provider com.google.android.apps.photos.content.GooglePhotosImageProvider from ProcessRecord{454ca9d0 5914:com.propertymanager/u0a10231} (pid=5914, uid=10231) requires com.google.android.apps.photos.permission.GOOGLE_PHOTOS or com.google.android.apps.photos.permission.GOOGLE_PHOTOS
at android.os.Parcel.readException(Parcel.java:1431)
at android.os.Parcel.readException(Parcel.java:1385)
at android.app.ActivityManagerProxy.getContentProvider(ActivityManagerNative.java:2896)
at android.app.ActivityThread.acquireProvider(ActivityThread.java:4755)
at android.app.ContextImpl$ApplicationContentResolver.acquireUnstableProvider(ContextImpl.java:2480)
at android.content.ContentResolver.acquireUnstableProvider(ContentResolver.java:1152)
at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:759)
at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:665)
at android.content.ContentResolver.openInputStream(ContentResolver.java:500)
at com.myapp.xxxx.determineCorrectScale(SourceFile:148)
Run Code Online (Sandbox Code Playgroud)
我导致它的代码是
public static int determineCorrectScale(Context con, Uri imagUri) {
int scale = 1;
InputStream imageStream = null;
imageStream = con.getContentResolver().openInputStream(imagUri);
.
.
.
}
Run Code Online (Sandbox Code Playgroud)
任何帮助?
编辑:这是我让用户在调用上述方法之前选择图片的方式
Intent choosePictureIntent = new Intent(Intent.ACTION_PICK, Images.Media.INTERNAL_CONTENT_URI);
tartActivityForResult(choosePictureIntent, REQUEST_CHOOSE_IMAGE);
Run Code Online (Sandbox Code Playgroud)
这是OnActivityResult:
protected void onActivityResult(int requestCode, int resultCode, Intent intent) …Run Code Online (Sandbox Code Playgroud) Android 5.1.1棒棒糖如果从图库中选择图像,则返回空文件路径.以下代码在5.1.1以下的所有设备中都能正常工作,但在棒棒糖5.1.1中不起作用
Uri contentUri = data.getData();
Cursor cursor = null;
try {
String[] proj = {MediaStore.Images.Media.DATA};
cursor = context.getContentResolver().query(contentUri, proj, null, null, null);
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
} finally {
if (cursor != null) {
cursor.close();
}
}
Run Code Online (Sandbox Code Playgroud)
cursor.getString(column_index)返回null.
从图库和相机中选择裁剪图像在Android 7.0以下完成,但在Android Naught中它在相机中崩溃.我使用fileprovider但不起作用.
MainActivity.java
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button mBtn;
private Context context;
private static final int SELECT_PICTURE_CAMARA = 101, SELECT_PICTURE = 201, CROP_IMAGE = 301;
private Uri outputFileUri;
String mCurrentPhotoPath;
private Uri selectedImageUri;
private File finalFile = null;
private ImageView imageView;
private PermissionUtil permissionUtil;
Uri fileUri;
File file = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mBtn = (Button) findViewById(R.id.btn_img);
imageView = (ImageView) findViewById(R.id.img_photo);
permissionUtil = new PermissionUtil();
mBtn.setOnClickListener(this);
context = this; …Run Code Online (Sandbox Code Playgroud) 我不知道为什么会发生这种情况,但是我无法从Google相册提供者中选择图片。在API 27上进行测试。
如果我使用:
val intent = Intent(Intent.ACTION_GET_CONTENT)
intent.addCategory(Intent.CATEGORY_OPENABLE)
intent.type = "image/*"
Run Code Online (Sandbox Code Playgroud)
当我打开“照片”提供程序并浏览文件夹时,会看到很多这样的文件:
2019-03-02 12:04:15.164 17641-13395/? W/NetworkManagementSocketTagger: untagSocket(120) failed with errno -22
2019-03-02 12:04:22.528 13217-13217/? E/ResourceType: Style contains key with bad entry: 0x01010586
2019-03-02 12:04:22.535 13217-13217/? W/ResourceType: For resource 0x7f020366, entry index(870) is beyond type entryCount(468)
Run Code Online (Sandbox Code Playgroud)
当我单击图片时,我看到以下内容:
2019-03-02 12:04:34.150 13217-13217/? W/ResourceType: For resource 0x7f02036c, entry index(876) is beyond type entryCount(468)
2019-03-02 12:04:34.151 13217-13217/? W/ResourceType: For resource 0x7f02036c, entry index(876) is beyond type entryCount(468)
2019-03-02 12:04:34.229 2907-16891/? W/MediaExtractor: …Run Code Online (Sandbox Code Playgroud) android android-intent kotlin google-photos document-provider
使用Google相册应用,我正在尝试选择未在设备上缓存的视频.
我正在使用ACTION_GET_CONTENT意图来启动选项对话框,并从那里选择Google相册应用.
在选择本地视频时,它会以此形式返回Uri.
内容://媒体/外部/视频/媒体/ 6708
然后,我查询内容提供程序以检索实际的文件位置,然后从那里继续.文件位置如下所示.
/ storage/emulated/0/WhatsApp/Media/WhatsApp Video/VID-20131102-WA0000.mp4
现在,当我选择在线视频时,即:我的设备上尚未提供的视频,以及需要下载以供使用的视频,返回的Uri如下所示:
内容://com.google.android.apps.photos.content/1/ https://lh6.googleusercontent.com/_RD-QTO_SK5jlaPldTe2n5GANqMc3h-ukcbNoFlF1NLy=s0-d
现在,有了这个,没有记录的ContentProvider可以帮助我获得这个视频的实际链接.即使我进行查询,它也不会返回DISPLAY_NAME和SIZE列.
DISPLAY_NAME包含video.mpeg(不同视频的显示名称相同)
SIZE可能会告诉我实际文件的大小.
我检查了各种帖子,并认为我必须通过内容提供商获取视频的InputStream,保存文件,并使用该文件.然而,选择图像文件可以正常工作,但对于视频则不然.
因此,要将流复制到文件,我有这个代码.
InputStream inputStream = context.getContentResolver().openInputStream(Uri.parse(path));
最后写入临时文件.该文件已创建,但似乎没有正确格式化.VLC播放文件,但始终只显示第一帧.
如果我从上面给出的URI的最后一部分获取URL,并尝试在浏览器上查看它,它会下载一个GIF文件.我猜这是问题所在.但我不知道如何获得视频的mpeg格式.
有谁经历过同样的经历?
android android-intent android-photos google-plus google-photos
我收到了来自Android 6.0.1用户的崩溃报告:
STACK_TRACE=java.lang.SecurityException: Permission Denial: reading com.google.android.apps.photos.contentprovider.MediaContentProvider uri content://com.google.android.apps.photos.contentprovider/0/1/content%3A%2F%2Fmedia%2Fexternal%2Fimages%2Fmedia%2F19181/ORIGINAL/NONE/443149508 from pid=18891, uid=10128 requires the provider be exported, or grantUriPermission()
at android.os.Parcel.readException(Parcel.java:1620)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:183)
at android.database.DatabaseUtils.readExceptionWithFileNotFoundExceptionFromParcel(DatabaseUtils.java:146)
at android.content.ContentProviderProxy.openTypedAssetFile(ContentProviderNative.java:692)
at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1104)
at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:942)
at android.content.ContentResolver.openInputStream(ContentResolver.java:662)
at fr.free.nrw.commons.upload.UploadService.uploadContribution(UploadService.java:176)
at fr.free.nrw.commons.upload.UploadService.handle(UploadService.java:114)
at fr.free.nrw.commons.upload.UploadService.handle(UploadService.java:27)
at fr.free.nrw.commons.HandlerService$ServiceHandler.handleMessage(HandlerService.java:19)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.os.HandlerThread.run(HandlerThread.java:61)
Run Code Online (Sandbox Code Playgroud)
从周围看,这似乎与Google相册许可有关com.google.android.apps.photos.permission.GOOGLE_PHOTOS。我的清单中已经具有此权限,但是该用户正在运行API 23,该API需要运行时权限。
问题是,如何为此调用运行时权限?我知道如何针对https://developer.android.com/training/permissions/requesting.html#perm-check所述的标准权限执行此操作,但是当我尝试执行此操作时
ActivityCompat.requestPermissions(thisActivity,
new String[]{com.google.android.apps.photos.permission.GOOGLE_PHOTOS},
Run Code Online (Sandbox Code Playgroud)
它不会编译。
我需要在运行时请求才能从Google相册访问图像的权限的名称是什么?
android android-permissions google-photos android-6.0-marshmallow