相关疑难解决方法(0)

使用新的Google相册应用选择照片已损坏

我的应用程序可以从库中选择照片.我想要从这个选择中获取文件路径.

这是创建选择照片的意图的代码:

    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 android-intent android-gallery google-photos

47
推荐指数
2
解决办法
2万
查看次数

java.lang.SecurityException:权限拒绝:打开提供者com.google.android.apps.photos.content.GooglePhotosImageProvider

突然间,我开始从运行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

17
推荐指数
2
解决办法
2万
查看次数

Android 5.1.1棒棒糖如果从图库中选择图像,则返回空文件路径

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

12
推荐指数
2
解决办法
5746
查看次数

如何从Android 7.0中的相机或图库中选择裁剪图像?

从图库和相机中选择裁剪图像在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)

android android-gallery android-7.0-nougat

12
推荐指数
2
解决办法
3万
查看次数

使用ACTION_GET_CONTENT或OPEN_DOCUMENT从Google相册提供者中选择

我不知道为什么会发生这种情况,但是我无法从Google相册提供者中选择图片。在API 27上进行测试。

使用ACTION_GET_CONTENT

如果我使用:

val intent = Intent(Intent.ACTION_GET_CONTENT)
intent.addCategory(Intent.CATEGORY_OPENABLE)
intent.type = "image/*"
Run Code Online (Sandbox Code Playgroud)
  • 我可以在提供商中看到Google相册
  • 我可以浏览到一些图片并选择它
  • 然后,我被定向到提供程序列表(而不是我的应用程序),就像提供程序在尝试捕获中崩溃一样

当我打开“照片”提供程序并浏览文件夹时,会看到很多这样的文件:

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

8
推荐指数
1
解决办法
638
查看次数

从Google相册应用中获取视频(非本地)

使用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可能会告诉我实际文件的大小.

在SO上提到这篇文章.

我检查了各种帖子,并认为我必须通过内容提供商获取视频的InputStream,保存文件,并使用该文件.然而,选择图像文件可以正常工作,但对于视频则不然.

因此,要将流复制到文件,我有这个代码.

InputStream inputStream = context.getContentResolver().openInputStream(Uri.parse(path));

最后写入临时文件.该文件已创建,但似乎没有正确格式化.VLC播放文件,但始终只显示第一帧.

如果我从上面给出的URI的最后一部分获取URL,并尝试在浏览器上查看它,它会下载一个GIF文件.我猜这是问题所在.但我不知道如何获得视频的mpeg格式.

有谁经历过同样的经历?

android android-intent android-photos google-plus google-photos

5
推荐指数
1
解决办法
3103
查看次数

读取com.google.android.apps.photos.contentprovider.MediaContentProvider要求导出提供程序,或grantUriPermission()

我收到了来自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

5
推荐指数
1
解决办法
7782
查看次数