标签: android-contentresolver

Intent.ACTION_GET_CONTENT 打开最近的文件,这给出了一个错误的 URI

我正在使用Intent.ACTION_GET_CONTENT它打开最近的文件。从最近的文件中选择项目会产生错误的 URI,但从文件管理器中选择相同的文件会提供正确的 URI,可以由我的代码处理。

public static String getRealPathFromURI(Context context, Uri uri) {
    String path;
    if ("content".equals(uri.getScheme())) {
        Cursor cursor = context.getContentResolver().query(uri, null, null, null, null);
        cursor.moveToFirst();
        int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
        path = cursor.getString(idx);
        cursor.close();
    } else {
        path = uri.getPath();
    }

    return path;
}
Run Code Online (Sandbox Code Playgroud)

注意:uri.getPath()当我从最近的文件中选择 PDF 时的输出是/document/...但从文件管理器中选择相同的文件时,.../emulated/....

注意:从最近的文件中选择文件时的错误是

无法从 CursorWindow 读取第 0 行、第 -1 行。在访问 Cursor 中的数据之前,确保它已正确初始化。

android android-intent android-contentresolver android-cursor

6
推荐指数
1
解决办法
1907
查看次数

如何在Android中收听新照片?

我需要收听来自任何来源的新图像,例如下载图像,捕获新图像,其他应用程序下载图像等等.是否有任何监听器会在新图片添加到图库时触发事件?我一直在寻找两天.我无法得到任何可靠的东西.

我读到了 FileObserver,这会有帮助吗?

android android-contentresolver android-gallery android-mediascanner fileobserver

6
推荐指数
1
解决办法
2361
查看次数

当 wifi 不可用但蜂窝数据在三星设备上时,ContentResolver requestSync 不会触发 SyncAdapter onPerformSync

问题如下。我有一个有效的 SyncAdapter 和 ContentResolver 设置。onPerformSync当我打开 wifi 但 wifi 没有互联网连接(它连接到 IOT 设备)时,不会触发SyncAdapters 的问题。我有一张 SIM 卡,可以使用蜂窝数据。在应用程序中,我设置了 NetworkManager,因此我请求蜂窝数据,如下所示:

val req = NetworkRequest.Builder()
req.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
req.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
Run Code Online (Sandbox Code Playgroud)

如果我创建一个 API 请求而不是触发ContentResolver.requestSync它正常工作。

此代码在华为平板电脑上也能正常工作,但不能在三星上正常工作。

所以基本上。我有蜂窝网络,但 SyncAdapter 没有意识到这一点(在三星设备上)并且不会触发onPerformSync. 无论如何要让 SyncAdapter 意识到这一点?

android android-contentresolver android-syncadapter kotlin networkmanager

6
推荐指数
0
解决办法
53
查看次数

为什么 ContentResolver 看不到其他应用程序添加的文件?

Documents/MyExcelsFolder 我通过使用添加了文件ContentResolver.insert,然后还Documents/MyExcelsFolder通过另一个应用程序将新文件添加到了文件夹(例如FileManager

MyExcelsFolder然后我尝试从文件夹中获取所有文件

fun getAppFiles(context: Context): List<AppFile> {
        val appFiles = mutableListOf<AppFile>()

        val contentResolver = context.contentResolver
        val columns = mutableListOf(
            MediaStore.Images.Media._ID,
            MediaStore.Images.Media.DATA,
            MediaStore.Images.Media.DATE_ADDED,
            MediaStore.Images.Media.DISPLAY_NAME,
            MediaStore.Images.Media.MIME_TYPE
        ).apply {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                add(
                    MediaStore.MediaColumns.RELATIVE_PATH
                )
            }
        }.toTypedArray()
        val extensions = listOf("xls", "xlsx")
        val mimes = extensions.map { MimeTypeMap.getSingleton().getMimeTypeFromExtension(it) }

        val selection = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            "${MediaStore.MediaColumns.RELATIVE_PATH} LIKE ?"
        } else {
            "${MediaStore.Images.Media.DATA} LIKE ?"
        }

        val selectionArgs = arrayOf(
            "%${Environment.DIRECTORY_DOCUMENTS}/MyExcelsFolder%"
        ) …
Run Code Online (Sandbox Code Playgroud)

android uri file file-manager android-contentresolver

6
推荐指数
1
解决办法
1092
查看次数

如何删除 Android 10 范围存储中的图像(媒体存储条目和文件)

当我尝试删除我的应用程序贡献/拥有的图像时,它可以轻松删除。但对于我的应用程序不拥有的图片文件夹内的共享媒体,我通过捕获 向用户显示提示RecoverableSecurityException。但即使在ALLOWING之后,我也无法删除该特定图像文件。

这是我正在使用的代码,请指出我做错了什么。

  • 删除后,图像不会出现在图库或我的应用程序中,但它保留在文件管理器中,并在手机重新启动后重新出现在图库中(我猜只有 MediaStore 条目被删除)
  • 该代码适用于 Android 11 设备。
  • 结果startIntentSenderForResult(intentSender, 12, null, 0, 0, 0, null);RESULT_OK

用于获取文件:(此代码位于“我的活动”中)

   try {
            String DIRECTORY_NAME = "%Pictures/App_Name%";
            String selection = MediaStore.MediaColumns.RELATIVE_PATH + " like ? ";
            String[] selectionArgs = new String[]{DIRECTORY_NAME};
            ContentResolver contentResolver = this.getContentResolver();
            Cursor cursor = contentResolver.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, selection, selectionArgs, null);

            while(cursor.moveToNext()){
                long id = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID));
                Uri contentUri = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, id);

                uriArrayList.add(contentUri);

            }
            cursor.close();
        }
        catch (Exception e){
            e.printStackTrace();
        }
Run Code Online (Sandbox Code Playgroud)

对于删除图像文件:(此代码位于我的适配器类中)

    try {
    ContentResolver …
Run Code Online (Sandbox Code Playgroud)

android android-contentresolver android-studio android-10.0 scoped-storage

6
推荐指数
1
解决办法
3000
查看次数

麻烦编写内部内存android

void launchImageCapture(Activity context) {
    Uri imageFileUri = context.getContentResolver()
        .insert(Media.INTERNAL_CONTENT_URI, new ContentValues());
    m_queue.add(imageFileUri);
    Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);

    i.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, imageFileUri); 
    context.startActivityForResult(i, ImportActivity.CAMERA_REQUEST); 
}
Run Code Online (Sandbox Code Playgroud)

以上代码一直有效,现在在insert()中为我生成了这个例外.

java.lang.UnsupportedOperationException: Writing to internal storage is not supported.
     at com.android.providers.media.MediaProvider.generateFileName(MediaProvider.java:2336)
     at com.android.providers.media.MediaProvider.ensureFile(MediaProvider.java:1851)
     at com.android.providers.media.MediaProvider.insertInternal(MediaProvider.java:2006)
     at com.android.providers.media.MediaProvider.insert(MediaProvider.java:1974)
     at android.content.ContentProvider$Transport.insert(ContentProvider.java:150)
     at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:140)
     at android.os.Binder.execTransact(Binder.java:287)
     at dalvik.system.NativeStart.run(Native Method)
Run Code Online (Sandbox Code Playgroud)

这不是一个空间问题,我唯一改变的是一个不相关的类的包.另外,我重新启动了手机.

storage android exception android-contentresolver android-contentprovider

5
推荐指数
2
解决办法
7138
查看次数

将多个参数放入ContentResolver.requestSync

我正在制作一个具有syncAdapter的应用.

我希望能够与一些将通过其捆绑发送的参数一起执行requestSync.原因是我希望选择syncAdapter实例会做什么.

由于某种原因,putSerializable和putIntArray都会导致ContentResolver抛出异常:

08-16 14:34:49.080: E/AndroidRuntime(10318): java.lang.IllegalArgumentException: unexpected value type: java.util.MiniEnumSet
08-16 14:34:49.080: E/AndroidRuntime(10318):    at android.content.ContentResolver.validateSyncExtrasBundle(ContentResolver.java:1144)
08-16 14:34:49.080: E/AndroidRuntime(10318):    at android.content.ContentResolver.requestSync(ContentResolver.java:1111)
08-16 14:34:49.080: E/AndroidRuntime(10318):    at com.sciatis.syncer.syncing.SyncAdapter.requestSync(SyncAdapter.java:100)
08-16 14:34:49.080: E/AndroidRuntime(10318):    at 
...
Run Code Online (Sandbox Code Playgroud)

为什么会这样?有没有办法克服这个?把一个整数运行正常,但那些操作没有.

难道我做错了什么 ?有没有更好的方法来实现从活动向syncAdapter发送参数?

serialization android android-intent android-contentresolver android-syncadapter

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

使用MockContentResolver进行查询会导致NullPointerException

我们有一个扩展的JUnit测试类ActivityInstrumentationTestCase2<CommentActivity>.测试(以及我们正在测试的类)使用CommentContentProvider扩展ContentProvider来访问SQLite数据库,并且NullPointerException在提供程序上运行查询时,我们得到了[下面的完整堆栈跟踪].

我们实例化一个MockContentResolver,如下所示:

MockContentResolver mResolver;

public void setUp() {
    super.setUp();
    CommentContentProvider ccp = new CommentContentProvider();
    mResolver = new MockContentResolver();
    mResolver.addProvider(CommentContentProvider.AUTHORITY, ccp);
}
Run Code Online (Sandbox Code Playgroud)

稍后,在我们的测试中,当调用以下代码时,我们得到一个NullPointerException:

Cursor mCursor = mResolver.query(Uri.parse(mUri), null, null, null, null);
Run Code Online (Sandbox Code Playgroud)

即使我们等待实例化,MockContentResolver直到我们有一个被测活动的副本,我们也会得到相同的结果:

mActivity = getActivity();
MockContentResolver mResolver = new MockContentResolver(mActivity);
Run Code Online (Sandbox Code Playgroud)

我们已经确认mActivity不是空的.

一位同事介入Android源代码(未安装在我们的系统上),发现错误的最直接原因是在ContentProvider.enforceReadPermissionInner()getContext()第一行返回null .

我们看了一下这个看起来很相似的问题,但我认为这完全是一个不同的问题. 这个问题也是问题的类似症状,但他们没有实例化他们的问题MockContentResolver.我们在实例化我们时遇到了问题.

这是我们得到的堆栈跟踪:

java.lang.NullPointerException
at android.content.ContentProvider$Transport.enforceReadPermissionInner(ContentProvider.java:449)
at android.content.ContentProvider$Transport.enforceReadPermission(ContentProvider.java:394)
at android.content.ContentProvider$Transport.query(ContentProvider.java:194) …
Run Code Online (Sandbox Code Playgroud)

android nullpointerexception android-contentresolver android-contentprovider

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

与联系人地址android分别获取Region,State,PostCode

我在从设备联系人获取地址时遇到问题。通讯录应用程序随Android设备的不同而不同。例如,据我所见,联想中的联系人应用程序已分隔字段以输入街道,区域,邮政编码等,但我的nexus7和moto x中的联系人应用程序只有一个字段作为地址。在我的应用中,我有单独的文本视图来显示区域,州和邮政编码。我在onActivityResult中使用了以下代码。

if(resultCode == RESULT_OK){
    Uri contactData = intent.getData();
    Cursor c = getContentResolver().query(contactData, null, null, null, null);
    if (c.moveToFirst()) {
        //to get full address
        //String address = c.getString(c.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS));
        String name = c.getString(c.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.StructuredPostal.DISPLAY_NAME));
        String Street = c.getString(c.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.StructuredPostal.STREET));
        String City = c.getString(c.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.StructuredPostal.CITY));
        String State = c.getString(c.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY));
        String Zipcode = c.getString(c.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE));
        String District = c.getString(c.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.StructuredPostal.REGION));

        System.out.print("name----" + name);
        System.out.print("Street----" + Street);
        System.out.print("City----" + City);
        System.out.print("State----" + State);
        System.out.print("Zipcode----" + Zipcode);
        System.out.print("District----" + District);
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是我在字符串“ Street”中获取了整个地址。示例街---- 123,ABC街,xyz,123456。其余的City,State等为空。有人对此有解决方案吗?

performance android android-contentresolver android-contentprovider android-contacts

5
推荐指数
0
解决办法
384
查看次数

以编程方式批量添加数千个Android联系人

使用ContentResolver.applyBatch和ContentResolver.bulkInsert方法一次性添加数千个联系人非常慢。Android是否提供另一种方式来批量添加联系人,而这种方式会更快呢?

到目前为止,我已经尝试了以下方法:

使用applyBatch(每千个联系人约75秒)

对于每个联系人:

  • 创建一个新的ContentValues对象以表示原始联系人
  • 生成一个新的ContentProviderOperation,将其插入到RawContacts表中
  • 将此操作添加到列表并存储其索引
  • 为其他联系人字段(例如姓名和电话号码)创建ContentValues对象
  • 生成一个新的ContentProviderOperation,以将其插入到Data表中,并向后引用原始联系人插入操作
  • 将这些操作添加到列表中

最后,使用ContentResolver.applyBatch来应用所有操作。

使用bulkInsert(每千个联系人约40秒)

对于每个联系人:

  • 创建一个新的ContentValues对象以表示原始联系人
  • 生成一个新的ContentProviderOperation,将其插入到RawContacts表中
  • 将此操作添加到列表中

然后,使用ContentResolver.applyBatch应用所有操作。这将返回一个ContentProviderResults数组。

现在,对于每个联系人:

  • 从相应的ContentProviderResult解析原始联系人ID。
  • 为联系人的所有数据字段构造一个ContentValues对象的数组,每个数据字段都带有一个原始联系人ID的字段
  • 使用ContentResolver.bulkInsert将它们插入到数据表中

问题

  • 在第二种方法中,我首先对RawContacts表条目执行applyBatch,然后对输入的Data表执行bulkInsert。这是因为我无法找到一种方法来提供Data条目的原始联系人ID。是否有与bulkInsert的反向引用类似的东西,可以让我同时添加RawContacts和Data条目?
  • applyBatch和bulkInsert只能在一个批处理中执行这么多插入操作,然后他们才抱怨事务太大。因此,必须每500个触点左右应用一次。有没有办法更改此限制?
  • 有没有一种完全不同的,更快的方式一次添加数千个联系人?

android android-contentresolver android-contacts

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