我正在开发一个需要线程短信的应用程序。我能够从收件箱中检索内容,但在线程视图中,短信必须同时填写收件箱和已发送项目。
两者分开content://sms/inbox并且content://sms/sent运行良好。
如何加入来自两个 URI 的内容并按时间排序?
我可以使用content://sms/all吗?
当使用 ALL CONTENT URI 时,为游标返回空值。
这该怎么做?
我想开发一个支持插件并为这些插件提供数据的应用程序。在我看来,在 Android 上实现此插件架构的正确方法是主应用程序一个 apk,每个插件一个 apk。
但是由于主应用程序和每个插件都在不同的 apk 中,我无法轻松地将(数据)对象从一个传递到另一个,应用程序在不同的进程中运行,即使它们在一个进程中运行(可以实现)它们有不同的类加载器,这不起作用。目前,我看到了两种从我的主应用程序获取数据到我的插件的有前途的方法:
ContentProvider. 这在我看来是预期的方法,因为它正是我想要实现的目标:向另一个进程提供内容/数据。Parcelable并使用AIDL或 - 如果我不需要多线程 - 使用 - 方法推动它们Messenger。在我看来,这种方法似乎更容易,因为我可以使用一个 ORM 库,它在后台关心数据库。我以前从未使用过 ContentProvider,但第一眼看到它时,我认为使用 ContentProvider 有点像手动构建 SQL 查询(如果我错了,请告诉我),我想避免这种工作!现在我想知道我是否遗漏了任何优点或缺点,以及这两种方法之间是否存在显着的性能差异。您更喜欢哪种解决方案,为什么要这样做?
提前致谢!任何答复表示赞赏!
我使用a ContentProvider来查询数据库并返回一个Cursor用于CursorLoader:
ItemsActivity:
public class ItemsActivity extends SherlockActivity implements LoaderCallbacks<Cursor> {
@Override
public void onCreate(Bundle savedInstance) {
....
getSupportLoaderManager().initLoader(LOADER_ID, null, this);
...
}
@Override
public Loader<Cursor> onCreateLoader(int loaderId, Bundle bundle) {
return new CursorLoader(getApplicationContext(), itemsListUri, ...);
}
...
}
Run Code Online (Sandbox Code Playgroud)
ItemsContentProvider:
public Cursor query(Uri uri, String[] projection, String selection, ...) {
SqliteQueryBuilder builder = new SqliteQueryBuilder();
builder.setTables(ItemsTable.NAME);
return builder.query(db, projection, selection, ...);
}
Run Code Online (Sandbox Code Playgroud)
活动有一个ListView,我使用CursorAdapter(通过更新LoaderCallbacks)来表示光标内的数据.
这工作正常,直到我需要查找大型数据集中的项目(例如,超过30,000行).观察日志我发现查找超出了内存限制,并且从结果游标中删除了一些行.
我的问题:在使用这样的游标时,处理非常大的数据集的最佳方法是什么?
我目前的解决方案是将SQLite查询ContentProvider拆分为具有偏移和限制的查询序列,然后使用MergeCursor …
当我在 Android 中查询 SMS 提供商时,我会收到从旧到最新的消息。我正在使用以下查询:
Cursor cursor = getContentResolver().query(messagesUri,null,null,null,null);
Run Code Online (Sandbox Code Playgroud)
是否可以以相反的方式对其进行排序?
我正在制作一个具有允许将图像上传到Web服务器的功能的应用程序。将捕获的图像上传到服务器后,该图像将从用户的设备中删除。我可以上传图像,并在检查文件管理器后将其删除。但是当我打开图库时,尽管它显示“无法加载文件”,但它仍然存在。但是,当我检查详细信息时,它会显示图像的大小。那么,如何从文件管理器和图库中完全删除上传的图像?
这是我的代码:
Public Static Boolean deleteDirectory(File path) {
// TODO Auto-generated method stub
if( path.exists() ) {
File files = path;
if(files.isDirectory()) {
deleteDirectory(files);
}
else {
files.delete();
}
}
return(path.delete());
}
Run Code Online (Sandbox Code Playgroud) android image delete-file android-contentprovider android-file
我的应用程序能够打开和处理某些文件。因此,您可以在文件管理器中点击这样的文件,我的应用程序将被提供来打开它。清单文件中的意图过滤器的设置如下。
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:mimeType="text/plain" />
</intent-filter>
Run Code Online (Sandbox Code Playgroud)
像这样读取和处理文件效果很好:
Context.getContentResolver().openInputStream(getIntent().getData());
Run Code Online (Sandbox Code Playgroud)
问题是,我想在处理后删除该文件。(如果用户选中该文件的复选框)用户通常在使用我的应用程序打开该文件后不再需要该文件。
目前,只有当文件作为文件 uri(以 file:// 开头)提供给我时,我才能执行此操作。在这种情况下,这段代码可以正常工作:
new File(contentUri.getPath()).delete();
Run Code Online (Sandbox Code Playgroud)
但如果该文件作为内容 uri 提供,我不知道如何删除该文件。(以内容://开头)
例如,返回 null,并且不执行任何操作:
Context.getContentResolver().delete(getIntent().getData(), null, null);
Run Code Online (Sandbox Code Playgroud) 我找到了一些删除数据库并使用 ContentProvider 重新创建它的解决方案。
ContentResolver resolver = mContext.getContentResolver();
ContentProviderClient client = resolver.acquireContentProviderClient(KOOPSContentProvider.AUTHORITY);
assert client != null;
KOOPSContentProvider provider = (KOOPSContentProvider) client.getLocalContentProvider();
assert provider != null;
provider.resetDatabase();
client.release();
Run Code Online (Sandbox Code Playgroud)
但在ContentProviderClient类已经release()被弃用,是否有任何其他的方式来释放资源。
编辑:如果我尝试使用close(),它显示如下警告。
This ContentProviderClient should be freed up after use with #release().许多资源,例如 TypedArrays、VelocityTrackers 等,在使用后应该回收(通过 recycle() 调用)。此 lint 检查查找丢失的 recycle() 调用。
和close()显示为禁用,为什么?
android android-contentresolver android-contentprovider contentproviderclient
所以,我已经使用 Realm 一段时间了。现在,我有一项任务是与我的其他应用程序共享登录数据。
由于登录数据是使用 Realm 存储的。我选择使用内容提供者。
我找到了一个例子:https : //speakerdeck.com/androhi/realm-with-contentprovider
不幸的是,我无法让它发挥作用。这是我在应用 A 中的内容提供者
static final String[] sColumns = new String[]{
"LoginResultData"
};
public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection,
@Nullable String[] selectionArgs, @Nullable String sortOrder) {
Realm mRealm = Realm.getDefaultInstance();
RealmQuery<LoginResultData> query = mRealm.where(LoginResultData.class);
LoginResultData result = query.findFirst();
String json = new Gson().toJson(result);
MatrixCursor matrixCursor = new MatrixCursor(sColumns);
Object[] rowData = new Object[]{json};
matrixCursor.addRow(rowData);
return matrixCursor;
}
Run Code Online (Sandbox Code Playgroud)
App B(需要获取登录数据)在我挂起时
getContentResolver.query(uri, null, null, null, …Run Code Online (Sandbox Code Playgroud) 我正在使用带有 的游标加载器,RecyclerView其他一切正常,除了每次从 RecyclerView 中删除一个项目时,最后一个项目闪烁,就像这样
我的删除代码是
public void deleteData(long id){
Uri uri = ContentUris.withAppendedId(URI, id);
getContentResolver().delete(uri, null, null);
}
Run Code Online (Sandbox Code Playgroud)
刷卡代码:
deleteData(viewHolder.getItemId());
Run Code Online (Sandbox Code Playgroud)
请注意,我有一个使用相同的另一个活动RecyclerAdapter,ContentProvider甚至大多数的实现和方法途径和布局代码,都是一样的,但一个完美的作品没有任何闪烁,所以这对我来说是很奇怪的情况。
是否有可能导致此问题的特定原因?我已经尝试禁用动画
recyclerView.getItemAnimator().setChangeDuration(0);
Run Code Online (Sandbox Code Playgroud)
或者
((DefaultItemAnimator) recyclerViewObject.getItemAnimator()).setSupportsChangeAnimations(false);
Run Code Online (Sandbox Code Playgroud)
但这些都没有奏效,更不用说我确实希望动画正常工作。
编辑:断点上传:
在创建:
"main@4668" prio=5 tid=0x2 nid=NA runnable java.lang.Thread.State: RUNNABLE at com.jackz314.todo.HistoryActivity.onCreateLoader(HistoryActivity.java:803) at android.support.v4.app。 LoaderManagerImpl.createLoader(LoaderManager.java:539) at android.support.v4.app.LoaderManagerImpl.createAndInstallLoader(LoaderManager.java:548) at android.support.v4.app.LoaderManagerImpl.initLoader(LoaderManager.java:603) at com .jackz314.todo.HistoryActivity.displayAllNotes(HistoryActivity.java:394) 在 com.jackz314.todo.HistoryActivity.deleteExpiredNotes(HistoryActivity.java:767) 在 com.jackz314.todo.HistoryActivity.onCreate(HistoryActivity.java:129)
在 android.app.Activity.performCreate(Activity.java:6975) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1213) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2770) 在 android.app。 ActivityThread.handleLaunchActivity(ActivityThread.java:2892) at android.app.ActivityThread.-wrap11(ActivityThread.java:-1) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
在 android.os.Handler.dispatchMessage(Handler.java:105) 在 android.os.Looper.loop(Looper.java:164) 在 android.app.ActivityThread.main(ActivityThread.java:6541) 在 …
android android-contentresolver android-contentprovider android-cursorloader android-recyclerview
getCropAndSetWallpaperIntent()在android中使用时出现此错误
D/Exception: java.lang.IllegalArgumentException: Cannot use passed URI to set wallpaper; check that the type returned by ContentProvider matches image/*
Run Code Online (Sandbox Code Playgroud)
但是当我检查Content使用类型时,ContentResolver我得到了
D/CONTENT TYPE:: IS: image/jpeg
那么为什么Wallpaper Manager给我内容错误?
这是我用来获取图像 URI 的代码
public Uri getImageUri(Context inContext, Bitmap inImage) {
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
tempPath = MediaStore.Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null);
Log.d("URI OF SET IMAGE", tempPath);
ContentResolver cr = this.getContentResolver();
Log.d("CONTENT TYPE: ", "IS: " + cr.getType(Uri.parse(tempPath)));
return Uri.parse(tempPath);
}
Run Code Online (Sandbox Code Playgroud)
有任何想法吗 ?
android android-contentresolver android-contentprovider android-wallpaper
android ×10
delete-file ×2
sqlite ×2
aidl ×1
android-file ×1
image ×1
ipc ×1
realm ×1
sms ×1
uri ×1