标签: android-contentprovider

安装在控制台中显示错误:INSTALL FAILED CONFICTING PROVIDER

我正在试验Android SDK中的NotesList示例程序.我在程序中略有不同,但是当我安装编辑后的版本时,当我尝试安装原始备注程序已经在设备上时,我会在控制台中收到消息INSTALL_FAILED_CONFLICTING_PROVIDER.我需要在Provider中进行哪些更改才能使其成为唯一的数据库?如果我卸载原始备注程序然后安装我编辑的版本,它工作正常.

android android-contentprovider

141
推荐指数
14
解决办法
10万
查看次数

如何使用支持FileProvider将内容分享给其他应用程序?

我正在寻找一种方法,使用Android支持库的FileProvider正确地与外部应用程序共享(而不是OPEN)内部文件.

按照文档上的示例,

<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="com.example.android.supportv4.my_files"
    android:grantUriPermissions="true"
    android:exported="false">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/my_paths" />
</provider>
Run Code Online (Sandbox Code Playgroud)

并使用ShareCompat将文件共享给其他应用程序,如下所示:

ShareCompat.IntentBuilder.from(activity)
.setStream(uri) // uri from FileProvider
.setType("text/html")
.getIntent()
.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
Run Code Online (Sandbox Code Playgroud)

不起作用,因为FLAG_GRANT_READ_URI_PERMISSION仅授予data对intent 指定的Uri的权限,而不授予EXTRA_STREAMextra 的值(由set设置setStream).

我试图通过设置成安全android:exportedtrue的供应商,但FileProvider在内部检查,如果本身是出口,所以时,它抛出一个异常.

android android-contentprovider android-support-library android-fileprovider

130
推荐指数
7
解决办法
11万
查看次数

在Gradle中使用构建类型来运行在一台设备上使用ContentProvider的相同应用程序

我已经设置Gradle将包名称后缀添加到我的调试应用程序中,因此我可以使用我正在使用的发行版本并在一部手机上调试版本.我参考了这个:http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Types

我的build.gradle文件如下所示:

...
android
{
    ...
    buildTypes
    {
        debug
        {
            packageNameSuffix ".debug"
            versionNameSuffix " debug"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

一切正常,直到我开始在我的应用程序中使用ContentProvider.我明白了:

Failure [INSTALL_FAILED_CONFLICTING_PROVIDER]
Run Code Online (Sandbox Code Playgroud)

我知道这是因为两个应用程序(发布和调试)正在注册相同的ContentProvider权限.

我认为有一种可能来解决这个问题.如果我理解正确,您应该能够指定在构建时使用的不同文件.然后我应该能够将不同的权限放在不同的资源文件中(并从Manifest设置权限作为字符串资源)并告诉Gradle使用不同的资源进行调试构建.那可能吗?如果是,那么关于如何实现这一点的任何提示都会很棒!

或者也许可以使用Gradle直接修改Manifest?有关如何在一台设备上使用ContentProvider运行相同应用程序的任何其他解决方案始终是受欢迎的.

android gradle android-contentprovider android-gradle-plugin

121
推荐指数
8
解决办法
5万
查看次数

为什么ContentResolver.requestSync不会触发同步?

我正在尝试实现Google IO中讨论的内容提供商同步适配器模式- 幻灯片26.我的内容提供商正在工作,当我从Dev Tools Sync Tester应用程序触发它时,我的同步工作,但是当我调用ContentResolver时.来自我的ContentProvider的requestSync(帐户,权限,捆绑),我的同步永远不会被触发.

ContentResolver.requestSync(
        account, 
        AUTHORITY, 
        new Bundle());
Run Code Online (Sandbox Code Playgroud)

编辑 - 添加的清单片段我的清单xml包含:

<service
    android:name=".sync.SyncService"
    android:exported="true">
    <intent-filter>
        <action
            android:name="android.content.SyncAdapter" />
    </intent-filter>
    <meta-data android:name="android.content.SyncAdapter"
    android:resource="@xml/syncadapter" />
</service>
Run Code Online (Sandbox Code Playgroud)

- 编辑

与我的同步服务关联的syncadapter.xml包含:

<?xml version="1.0" encoding="utf-8"?>
<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android"  
    android:contentAuthority="AUTHORITY"
    android:accountType="myaccounttype"
    android:supportsUploading="true"
/>
Run Code Online (Sandbox Code Playgroud)

不确定其他代码会有用.传递给requestSync的帐户是"myaccounttype",传递给调用的AUTHORITY与我的syc适配器xml匹配.

ContentResolver.requestSync是否是请求同步的正确方法?看起来同步测试工具直接绑定到服务并调用启动同步,但这似乎违背了与同步架构集成的目的.

如果这是请求同步的正确方法,那么同步测试器为什么会工作,而不是我对ContentResolver.requestSync的调用?我需要在捆绑中传递一些东西吗?

我正在运行2.1和2.2的设备上的模拟器中进行测试.

android android-contentprovider android-syncadapter

112
推荐指数
1
解决办法
4万
查看次数

没有ContentProvider的CursorLoader用法

Android SDK文档说该startManagingCursor()方法已被删除:

不推荐使用此方法.改为使用新的CursorLoader类和LoaderManager; 这也可以通过Android兼容包在旧版平台上使用.此方法允许活动根据活动的生命周期为您管理给定的Cursor生命周期.也就是说,当活动停止时,它将自动调用给定Cursor上的deactivate(),稍后重新启动它将为您调用requery().当活动被销毁时,所有托管游标将自动关闭.如果您的目标是HONEYCOMB或更高版本,请考虑改为使用LoaderManager,可通过getLoaderManager()获取

所以我想用CursorLoader.但是当我在构造函数中需要URI时,如何使用自定义CursorAdapter和不使用它?ContentProviderCursorLoader

android cursor android-contentprovider android-loadermanager android-cursorloader

107
推荐指数
4
解决办法
5万
查看次数

何时使用内容提供商

我了解内容提供商允许在应用程序之间公开共享数据.但是,我想知道是否有人想让内容提供商只在你自己的应用程序中使用.这样做有什么好处吗?有什么缺点?

在过去,我刚刚实现了SQliteOpenHelper来访问我的数据库中的数据,但我正在考虑创建一个Content Provider.我觉得请求数据的URI方法简洁明了.另一方面,仅仅为我的应用程序使用内容提供程序是多余的(因为在其中我将有一个SQliteOpenHelper类)和更多的工作比我需要的?

android android-contentprovider

100
推荐指数
4
解决办法
3万
查看次数

使用Android中的内容提供程序公开多个表的最佳实践

我正在构建一个应用程序,我有一个事件表和一个场地表.我希望能够授予其他应用程序访问此数据的权限.我有几个与此类问题的最佳实践相关的问题.

  1. 我应该如何构建数据库类? 我目前有EventsDbAdapter和VenuesDbAdapter的类,它们提供查询每个表的逻辑,同时有一个单独的DbManager(扩展SQLiteOpenHelper)来管理数据库版本,创建/升级数据库,提供对数据库的访问(getWriteable/ReadeableDatabase).这是推荐的解决方案,还是我最好将所有内容整合到一个类(即DbManager)或分离所有内容并让每个适配器扩展SQLiteOpenHelper?

  2. 我应该如何为多个表设计内容提供程序? 扩展上一个问题,我应该为整个应用程序使用一个内容提供程序,还是应该为事件和场地创建单独的提供程序?

我发现的大多数示例只涉及单表应用程序,所以我很感激这里的任何指针.

sqlite android android-contentprovider

89
推荐指数
4
解决办法
4万
查看次数

"Content-Provider"和"SQLite数据库"之间的确切区别

我已经为Android做了SQLite数据库编程,但我对Content-Provider一无所知,除了这个:"我已经提到了Android开发者页面,Android SDK解释了"Content-provider",因为它用于存储和检索数据."

但是之后,

  1. "Content-Provider"和"SQLite数据库"之间的确切区别是什么?
  2. 什么时候最好存储数据?

任何例子或帮助!!

sqlite android android-contentprovider

85
推荐指数
5
解决办法
4万
查看次数

在ContentProvider中关闭数据库

本周我一直在学习有关ContentProvider的所有内容,并使用SQLiteOpenHelper类来管理提供程序内部数据库的创建和升级.具体来说,我一直在阅读sdk的samples目录中的NotePad示例.

现在,我可以看到SQLiteOpenHelper有一个close()方法.我知道将空闲数据库打开是不好的做法,可能导致内存泄漏等等(除非这个讨论朝着正确的方向发展).如果我在Activity中使用该类,那么我只需在onDestroy()方法中调用close(),但据我所知,ContentProvider与活动没有相同的生命周期.NotePad的代码似乎永远不会调用close(),所以我想假设它是由SQLiteOpenHelper或其他一些拼图处理的,但我真的很想知道.我真的不太相信示例代码,要么...

问题摘要:我们何时应该关闭提供商中的数据库,如果有的话?

sqlite android android-contentprovider

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

IllegalArgumentException:索引1处的绑定值为null

有谁知道这意味着什么?

12-31 20:55:45.861: ERROR/AndroidRuntime(12478): Caused by: java.lang.IllegalArgumentException: the bind value at index 1 is null
12-31 20:55:45.861: ERROR/AndroidRuntime(12478):     at android.database.sqlite.SQLiteProgram.bindString(SQLiteProgram.java:234)
12-31 20:55:45.861: ERROR/AndroidRuntime(12478):     at android.database.sqlite.SQLiteQuery.bindString(SQLiteQuery.java:182)
12-31 20:55:45.861: ERROR/AndroidRuntime(12478):     at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:48)
12-31 20:55:45.861: ERROR/AndroidRuntime(12478):     at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1345)
12-31 20:55:45.861: ERROR/AndroidRuntime(12478):     at android.database.sqlite.SQLiteQueryBuilder.query(SQLiteQueryBuilder.java:330)
12-31 20:55:45.861: ERROR/AndroidRuntime(12478):     at android.database.sqlite.SQLiteQueryBuilder.query(SQLiteQueryBuilder.java:280)
12-31 20:55:45.861: ERROR/AndroidRuntime(12478):     at net.lp.collectionista.providers.ProductContentProvider.query(ProductContentProvider.java:350)
12-31 20:55:45.861: ERROR/AndroidRuntime(12478):     at android.content.ContentProvider$Transport.query(ContentProvider.java:163)
12-31 20:55:45.861: ERROR/AndroidRuntime(12478):     at android.content.ContentResolver.query(ContentResolver.java:245)
12-31 20:55:45.861: ERROR/AndroidRuntime(12478):     at net.lp.collectionista.providers.FacadeContentProvider.query(FacadeContentProvider.java:563)
12-31 20:55:45.861: ERROR/AndroidRuntime(12478):     at android.content.ContentProvider$Transport.query(ContentProvider.java:163)
12-31 20:55:45.861: ERROR/AndroidRuntime(12478):     at android.content.ContentResolver.query(ContentResolver.java:245)
12-31 20:55:45.861: ERROR/AndroidRuntime(12478):     at net.lp.collectionista.util.ScanAddTask.existsProduct(ScanAddTask.java:164) …
Run Code Online (Sandbox Code Playgroud)

database sqlite android android-contentprovider

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