我维护一个库,其核心功能包括以编程方式捕获的屏幕截图与外部电子邮件应用程序共享.
我用a FileProvider来完成这个,这意味着我的库的清单包含一个<provider>标签:
<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="${applicationId}.bugshaker.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/filepaths" />
</provider>
filepaths.xml 定义如下:
<paths>
    <files-path path="bug-reports/" name="bug-reports" />
</paths>
我的库的消费者有一个应用程序,它本身使用a FileProvider来共享文件.我的期望是,如果使用应用程序使用以下清单<provider>标记,则应该可以允许两个提供程序共享文件:
<provider
    android:authorities="${applicationId}.fileprovider;${applicationId}.bugshaker.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true"
    android:name="android.support.v4.content.FileProvider"
    tools:replace="android:authorities">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_paths"
        tools:replace="android:resource" />
</provider>
这个清单条目:
Provider权限${applicationId}.fileprovider(用于应用程序文件共享)和${applicationId}.bugshaker.fileprovider(用于库文件共享);filepaths.xml,其中包含应用程序生成的文件和库生成的文件的单独目录定义:<paths>
    <external-path
        name="redacted"
        path="" />
    <files-path
        name="bug-reports"
        path="bug-reports/" />
</paths>
构建应用程序后,我们已确认生成的清单已使用这些更新的值替换了正确的节点.
但是,当使用此配置的应用程序组装(成功)并运行时,我们会看到启动时崩溃:
E: FATAL EXCEPTION: main
   Process: com.stkent.bugshakertest, PID: 11636
   java.lang.RuntimeException: Unable to …android android-manifest android-contentprovider manifest-merging
初学Android开发者在这里.
我正在尝试创建一个应用程序,它将读取存储在设备上的SMS消息,然后向用户提供有关其习惯的统计信息(例如他们经常发送消息的人,常用词等).
但据我所知,似乎没有办法做到这一点.我在论坛上四处看看,大多数人都在谈论访问收件箱,在那里你可以找到用户没有读过的邮件.那么默认应用程序和第三方(例如Handcent)如何显示相同的文本?他们不保留自己的数据库,因为Handcent将在全新安装时显示所有文本.
tl; dr:如何在Android设备上阅读SMS消息,特别是之前读过的消息.
目标:从XML数据刷新数据库
过程:
数据库操作相当标准的东西.问题是CRUD操作不是在内部完成,ContentProvider而是使用ContentResolver插件,例如看起来像resolver.insert(CONTENT_URI, contentValues).ContentResolver API似乎没有任何与事务相关的东西,我无法使用,bulkInsert因为我间歇性地插入2个表(另外我也希望delete在事务内部).
我正在考虑ContentProvider通过使用注册我自定义的监听器,registerContentObserver但由于ContentResolver#acquireProvider隐藏了方法,我如何获得正确的引用?
我运气不好吗?
sqlite android transactions android-contentresolver android-contentprovider
最近,Google为Google+(加号)添加了照片应用,当您启动Intent选择图片时,它会显示出来.但是,如果我从Google+照片中选择图片并尝试在我的应用程序中使用它,我当前的逻辑都无法返回可用的URI或URL来实际获取我可以下载和操作的图像.我目前正在使用"常用"方法来尝试操作可在Stack Overflow和其他地方找到的URI.如果需要,我可以提供代码,但此时我觉得它有点无关紧要,因为除了这个新的应用程序之外,它适用于其他所有内容.关于如何获得可用图像的任何想法?
URI看起来如下所示:
content://com.google.android.apps.photos.content/0/https%3A%2F%2Flh5.googleusercontent.com%<a bunch of letters and numbers here>
无论我从Google照片应用中选择什么,MediaColumns.DATA信息始终返回null并MediaColumns.DISPLAY_NAME始终返回image.jpg.如果我尝试将所有内容从https粘贴到浏览器的末尾,则不会出现任何问题.不知道如何从中获取有用的信息.
ContentObserver和之间有什么区别DatasetObserver?
什么时候应该使用?
我Cursor用单排.我希望收到有关数据更改的通知 - 例如.当行更新时.
我应该注册哪个观察员班?
很多Intent动作,例如ACTION_VIEW,Uri指向应该执行动作的内容.如果内容由文件支持 - 无论是Uri直接指向文件还是ContentProvider服务文件(请参阅参考资料FileProvider) - 这通常都有效.
在某些情况下,开发人员不希望将内容驻留在文件中以与其他应用程序共享.一种常见的情况是加密:解密的数据应该驻留在RAM中,而不是磁盘上,以最大限度地降低某人获取该解密数据的风险.
我从RAM共享的经典解决方案是使用ParcelFileDescriptor和createPipe().但是,当响应ACTION_VIEW(或其他)的活动获得InputStream该管道时,与ContentProvider从文件提供内容时获得的流相比,生成的流受到限制.例如,此示例应用程序适用于Adobe Reader并崩溃QuickOffice.
基于过去的 相关问题,我的假设是createPipe()真正创建一个管道,并且管道是不可寻找的.试图"倒带"或"快进"的客户因此遇到问题.
我正在寻找一种可靠的解决方案,用于与第三方应用程序共享内存内容,以解决此限制.特别:
它必须使用Uri可能被客户端应用程序(即ACTION_VIEW实现者)尊重的语法; 涉及客户端应用程序不太可能识别的某些麻烦的解决方案(例如,通过Intent额外的方式传递某些内容)不符合条件
要共享的数据不能作为共享的一部分写入文件(当然,客户端应用程序最终可以将收到的字节保存到磁盘,但暂时忽略该风险)
理想情况下,它不涉及应用程序寻求共享数据开放ServerSocket或以其他方式加剧安全风险
可能建议的想法包括:
某种重新配置的方法会导致可createPipe()搜索的管道
某种使用基于套接字的方法FileDescriptor可以产生可搜索的管道
某种RAM磁盘或其他东西,感觉像Android的其余部分的文件,但不是持久的
如果你愿意的话,一个关键的工作解决方案就是如果我可以从RAM中获得QuickOffice可以读取的PDF.
有什么建议?
谢谢!
我有一个问题,我只是想不通.我使用Eclipse创建自己的内容提供程序,但不断收到以下错误:
[..] ERROR/ActivityThread(1051):无法找到my.package.provider.countrycontentprovider的提供商信息
代码见:http://codepad.org/Rx00HjHd
主要部分:
public class CountryContentProvider extends ContentProvider {
    public static final String PROVIDER = 
         "my.package.provider.countrycontentprovider";
    public static final Uri CONTENT_URI = 
         Uri.parse("content://" + PROVIDER + "/country");
    // ...
    @Override
    public boolean onCreate() { return true; }
    // ...
}
// from my activity
ContentResolver resolver = getContentResolver();
Cursor c = resolver.query(CountryContentProvider.CONTENT_URI, 
                                  null, null, null, null);  
// AndroidManifest.xml
<provider
    android:name="my.package.provider.CountryContentProvider"
    android:authorities="my.package.provider.countrycontentprovider" />
我已将提供程序添加到清单中,并从onCreate函数返回true .我CountryContentProvider.CONTENT_URI在我的活动中使用来自我的提供者的内容,但我只是不断收到该错误消息.我删除并添加了三次代码(在日食融化的情况下)无济于事.
我肯定错过了什么.有人能指出我正确的方向吗?
因此,在观看关于此主题的非常有名的视频后,我决定采用设计模式B.使用带有servicehelper的contentprovider.

基本上我有以下文件:
在活动中,我现在可以获取contentresolver并查询提供者.到目前为止一切都很好.
现在我需要同步我的contentprovider以从REST API获取数据.因此,我需要实现服务帮助程序服务和Rest方法.研究谷歌IO应用程序已经帮助了我很多,我是Android的新手所以它仍然很难搞清楚.
我看到谷歌使用RemoteHandlers来处理外部数据,我猜他们是图中的处理器类?
我不明白的是我如何实现servicehelper +服务部分来从网络获取数据.
我已经在堆栈上阅读了几个关于此的主题,所有这些都提出了不同的方法 我找到了一个声明restprovider的示例,然后myProvider必须扩展该提供程序.我不喜欢这些解决方案,并希望遵循这种结构化设计模式.我希望你们能帮助我!
rest android android-service android-contentprovider googleio
我创建了一个Activity,因为我正在实现CursorLoader以从数据库加载数据.
我已经为该表的所有记录做了那件事,但我想加载30-30条记录,比如加载更多功能
我试图创建查询并加载前30条记录,但我无法理解如何请求新记录.
我的活动代码如下:
public class ProductListActivity extends AppCompatActivity
        implements LoaderManager.LoaderCallbacks<Cursor> {
    /**
     * Records in list
     */
    int offset = 0;
    /**
     * For Current Activity *
     */
    Context mContext;
    /**
     * Activity Binding
     */
    ActivityProductListBinding activityProductListBinding;
    /**
     * Product Adapter
     */
    ProductListAdapter productListAdapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        /**
         * DataBinding with XML
         */
        activityProductListBinding = DataBindingUtil.setContentView(this, R.layout.activity_product_list);
        /**
         * Getting Context
         */
        mContext = getApplicationContext();
        /***
         * TOOLBAR Settings...
         */
        setSupportActionBar(activityProductListBinding.toolbar);
        activityProductListBinding.toolbarTitleTextview.setText(R.string.string_title_products); …android android-contentprovider android-cursor android-cursorloader android-cursoradapter
我在这个问题上有点困惑,如果使用ContentProvider或者更好Database.或者,如果我不想与其他应用程序共享任何数据,则没有任何区别.
如果我理解正确,内容提供商基于数据库,SQLite并且它们的内容也可能只能访问我的应用程序.
你能解释一下吗?
非常感谢你,
穆尔