我正在使用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
我需要收听来自任何来源的新图像,例如下载图像,捕获新图像,其他应用程序下载图像等等.是否有任何监听器会在新图片添加到图库时触发事件?我一直在寻找两天.我无法得到任何可靠的东西.
我读到了 FileObserver,这会有帮助吗?
android android-contentresolver android-gallery android-mediascanner fileobserver
问题如下。我有一个有效的 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
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) 当我尝试删除我的应用程序贡献/拥有的图像时,它可以轻松删除。但对于我的应用程序不拥有的图片文件夹内的共享媒体,我通过捕获 向用户显示提示RecoverableSecurityException。但即使在ALLOWING之后,我也无法删除该特定图像文件。
这是我正在使用的代码,请指出我做错了什么。
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
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
我正在制作一个具有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
我们有一个扩展的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
我在从设备联系人获取地址时遇到问题。通讯录应用程序随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
使用ContentResolver.applyBatch和ContentResolver.bulkInsert方法一次性添加数千个联系人非常慢。Android是否提供另一种方式来批量添加联系人,而这种方式会更快呢?
到目前为止,我已经尝试了以下方法:
使用applyBatch(每千个联系人约75秒)
对于每个联系人:
最后,使用ContentResolver.applyBatch来应用所有操作。
使用bulkInsert(每千个联系人约40秒)
对于每个联系人:
然后,使用ContentResolver.applyBatch应用所有操作。这将返回一个ContentProviderResults数组。
现在,对于每个联系人:
问题
android ×10
android-10.0 ×1
exception ×1
file ×1
file-manager ×1
fileobserver ×1
kotlin ×1
performance ×1
storage ×1
uri ×1