标签: android-syncadapter

如何处理REST调用,数据持久性,同步和观察ContentProvider

我知道这个问题被问了太多次,但我认为我试图针对的问题有点不同,可能更复杂.

我将开发一个使用RESTful Web服务的应用程序,并且需要满足以下要求:

  • 应用程序应该在列表和详细信息中显示一些书籍,作者和编辑

  • 该应用程序还应该允许搜索一本书

  • 书籍,作者和编辑器是从RESTful Web服务中获取的

  • 每个实体都必须被缓存,这样当我打开一个Activity时,我首先看到旧数据(如果有的话),而新的数据从网络更新.

  • 每次实体更新时,都应通知相关方(ContentObserver?定期Listener实施?)

  • 如果一个呼叫已经在执行(说到api/books/1337或来api/editors),应该通知呼叫者它正在加载数据,并且应该给它一个旧的(如果它存在),就像它是原始呼叫者一样.

  • 一些数据(只有书籍和作者)应每N分钟更新一次(由用户决定),并应通知观察员(SyncAdapter?)

问题:

在观看和研究Virgil Dobjanschi在Google I/O 2010上提出的所有组件之后,我对此表示怀疑:

  1. 如何透明地为任何呼叫者处理" 实体更新 "概念?我应该使用ContentObserverContentProvider我将要实施?

  2. 如果我使用a,ContentObserver我可以轻松地为单个实体设置状态标志(如Dobjanschi所建议的),例如UPDATING,INSERTING依此类推.但是我该如何处理清单呢?说我想要一本书清单,我应该把状态标志放在哪里?我应该将它放在状态表中仅列表吗?如果是这样,我应该观察两个Cursors,一个用于状态,一个用于实际列表(即表/内容URI).如果我要求的实体(尚未存在)或REST调用返回一个404怎么办?我该如何处理回调?

  3. 如果我将所有REST方法都放在一个中**SyncAdapter**,我可以"强制" SyncAdapter从网络更新实体/实体列表(并因此将其放入正确的表中)吗?这样,状态标志将是有用的.

  4. 可以SyncAdapter多个实体上工作(实际上,实体列表,因为我想偶尔更新书籍和编辑器),因为它只有一个performSync方法?

  5. 如果SyncAdapter用户在设备设置中禁用了我的实现,它将不会更新任何内容(这没关系).但是,如果用户单击"活动"中的"更新书籍"按钮,我仍然可以调用该performSync方法,还是也会被禁用?

rest android android-contentprovider android-syncadapter contentobserver

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

Android:测试syncadapter

我有一个同步适配器,正在将联系人与私人服务器同步.它看起来像样本中的SampleSyncAdapter(但当然经过修改以满足我的需求).

我需要为这个同步适配器编写测试.谁能给我一些关于如何编写这些测试的指南?

我坚持测试联系人操作(创建,更新,删除).我如何模拟联系人数据库,以便我可以测试那个而不是真正的联系人数据库?

谢谢

android mocking android-syncadapter android-contacts android-testing

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

SyncAdapter和Rest Server具有分页响应

我需要知道如何处理来自Rest Server的syncadapter和分页响应.我正在制作一个检索数据收集的Android应用程序.每个页面都有20个项目,我现在正在一个请求中检索所有项目.我认为我能做到的最好的方法是检索一个页面,例如,滚动到列表视图的末尾,使用syncAdapter发出另一个请求,但我不确定.

我正在寻找如何在REST中处理android的分页,但我没有找到任何有用的东西.我想知道是否有人可以帮助我.

谢谢.

这是我现在如何检索项目的示例.

public ArrayList<ContentProviderOperation> parse(String json) throws IOException, NullPointerException {

    final ArrayList<ContentProviderOperation> batch = new ArrayList<ContentProviderOperation>();

    AccountManager manager = AccountManager.get(mContext);
    Account account = ((KipptApplication)mContext.getApplicationContext()).getCurrentAccount();
    String authToken = manager.peekAuthToken(account, AuthenticatorActivity.PARAM_AUTHTOKEN_TYPE);

    Header[] headers = new Header[]{
            new BasicHeader(KipptConstants.API_USERNAME_KEY,account.name),
            new BasicHeader(KipptConstants.API_TOKEN_KEY,authToken)
    };


    Gson gson = new Gson();
    Type responseType = new TypeToken<Response<ClipObject>>() {}.getType();
    Response<ClipObject> inbox = gson.fromJson(json,responseType);

    List<ClipObject> clips = inbox.getObjects();

    String response = null;
    String next = inbox.getMeta().getNext();

    while(next !=null){

        try {
            Log.d(TAG,"Fetching more clips from: " + next); …
Run Code Online (Sandbox Code Playgroud)

rest android android-syncadapter

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

Android:同步适配器在某些设备中未运行

在我的 android 项目中,我有一个同步适配器,可以将数据从 android 设备同步到服务器并且工作正常,但最近我注意到 onPerfomSync 没有在我的 moto g3 android 手机中调用,我不知道是否有在任何其他手机上都有同样的问题,我在其他一些具有不同 android api 级别的三星手机上进行了测试,但没有发现任何问题。我已经配置了用户登录成功时的同步。这是什么原因行为。如果我做错了什么,请纠正我。下面是我的代码。

        private void finishLogin(Intent intent) {
    String accountName = intent.getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
    String accountPassword = intent.getStringExtra(PARAM_USER_PASS);
    final Account account = new Account(accountName, intent.getStringExtra(AccountManager.KEY_ACCOUNT_TYPE));

    if (getIntent().getBooleanExtra(ARG_IS_ADDING_ACCOUNT, false)) {
        String authtoken = intent.getStringExtra(AccountManager.KEY_AUTHTOKEN);
        String authtokenType = authTokenType;
        String refreshToken = intent.getStringExtra(KEY_REFRESH_TOKEN);
        Bundle userData = new Bundle();
        userData.putString(KEY_REFRESH_TOKEN, refreshToken);
        accountManager.addAccountExplicitly(account, accountPassword, userData);
        accountManager.setAuthToken(account, authtokenType, authtoken);
        accountManager.setUserData(account,KEY_REFRESH_TOKEN,refreshToken);

        ContentResolver.setMasterSyncAutomatically(true); 
        ContentResolver.setSyncAutomatically(account, "com.myexample.mysampleproject", true);
        configurePeriodicSync(account, SYNC_INTERVAL, SYNC_FLEXTIME);

        try {



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

android synchronization android-contentprovider android-syncadapter

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

如何添加到联系人的新联系人时,如何添加类似whatsapp的选项

我开发了一个需要做两件事的应用程序:

  • 创建一个用户帐户(如WhatsApp).
  • 每当有新的联系人条目时,如果联系人正在使用我的应用程序,则立即在联系人应用程序中显示联系人详细信息页面中的"呼叫"或"消息"选项.

android android-syncadapter android-contacts android-account android-contact-mimetype

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

当 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
查看次数

如何在Android上编写"立即同步"操作?

我有一个用于我的数据库的同步适配器,在应用程序使用的某些点,它需要立即同步数据库.我想触发同步适配器,就好像它的同步时间弹出一样,然后重新建立同步时间(即从此'同步现在'事件开始4小时).

android android-syncadapter

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

ContentProvider不会显示在"数据和同步"区域中

我正在尝试将自定义ContentProvider显示在数据和同步下,并且我遇到了一些问题.也就是说,它没有出现.

具体内容:

我的AndroidManifest.xml有提供者和服务:

<provider android:name="BooksProvider"
    android:label="ClientName Books"
    android:authorities="com.clientname.reader.books"
    android:enabled="true"
    android:exported="true"
    android:syncable="true">
    <grant-uri-permission android:pathPattern=".*" />
</provider>
<service android:name=".sync.SyncService"
     android:exported="true" android:process=":sync">
    <intent-filter>
        <action android:name="android.content.SyncAdapter" />
    </intent-filter>
    <meta-data android:name="android.content.SyncAdapater"
         android:resource="@xml/syncadapter" />
</service>
Run Code Online (Sandbox Code Playgroud)

res/xml/syncadapter.xml具有以下内容:

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

为了安全起见,我甚至在onCreate上打了以下电话:

AccountManager accountManager = AccountManager.get(getApplicationContext());
Account[] accounts = accountManager.getAccountsByType("com.google");
for(Account account : accounts){
    Log.d(TAG, "Account: " + account.name);
    ContentResolver.setIsSyncable(account, Reader.AUTHORITY, 1);
}
Run Code Online (Sandbox Code Playgroud)

当我加载Activity时,我从ContentResolver.setIsSyncable获取adb日志,说该帐户已经设置为可同步,因此该方法没有做任何事情.

但是,提供商拒绝显示在"设置">"帐户和同步">"数据和同步"中.有什么想法吗?任何人都知道如何确定该部分中出现的内容?

[edit]更多信息:

花了几个小时调试后,我遇到了这个错误:

04-11 10:46:02.370: DEBUG/SyncManager(105): can't find a sync adapter for SyncAdapterType Key {name=com.clientname.reader.books, …
Run Code Online (Sandbox Code Playgroud)

android android-contentprovider android-syncadapter

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

数据和同步 - 手动同步邮件.日历和联系人

我正在尝试编写一个只需单击即可同步我的邮件和日历的应用程序.在浏览了这个论坛之后,我发现了一些很好的提示,并编写了一个简短的测试应用程序,它使用我的第一个谷歌帐户并开始同步.

代码工作到目前为止,但目前只有联系人同步!

    AccountManager am = AccountManager.get(this);
    Account[] acc = am.getAccountsByType("com.google");
    Account account = null;
    if (acc.length > 0) {
        account = acc[0];

        Bundle extras = new Bundle();
        extras.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, true);
        extras.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true);

        ContentResolver.requestSync(account, ContactsContract.AUTHORITY,
                extras);
    }
Run Code Online (Sandbox Code Playgroud)

方法requestSync将"权限"作为参数,现在我使用"ContactsContract.AUTHORITY",我猜这只是同步我的联系人的原因.我现在的问题是,是否有人知道我必须使用哪个权限字符串才能同步我的邮件和日历?如果"null"用作权限,则所有三个(cal,contacts和mail)都会同步

public static void requestSync (Account account, String authority, Bundle extras)
Run Code Online (Sandbox Code Playgroud)

提前致谢!!

android android-syncadapter

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

删除帐户时删除数据库

我的应用程序使用SyncAdapter模式,使用AccountManager和保存用户凭据,以及ContentProvider在数据库中存储数据.

account被删除我可以删除使用方法的分贝在解释这个问题.通过执行以下操作删除数据库:

boolean deleted = mContext.deleteDatabase(DatabaseHelper.DATABASE_NAME);
Run Code Online (Sandbox Code Playgroud)

这工作正常,但当我再次登录时,一切仍然存在.感觉就像ContentProvider不知道数据库已被删除.

这个答案中,inazaruk说:

您需要确保已经杀死了托管使用该特定数据库文件的ContentProvider的进程.而且只是删除它.

杀死进程以清除数据库感觉不对.

还有更好的事吗?

android android-syncadapter android-account

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