Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SyncAdapter onPerformSync不';我不总是接到电话_Java_Android_Android Syncadapter - Fatal编程技术网

Java SyncAdapter onPerformSync不';我不总是接到电话

Java SyncAdapter onPerformSync不';我不总是接到电话,java,android,android-syncadapter,Java,Android,Android Syncadapter,我为我的应用程序构建了一个SyncAdapter,这样我就可以使用谷歌云消息触发数据库与服务器的同步。我使用截击来实际拨打网络电话并同步数据,但根据我在想同步你的应用时读到的信息,你应该有一个SyncAdapter 我的问题是,onPerformSync()并不总是运行。我将启动GCM,我总是会收到一个日志,说明它正确地通过了GCM,但是我的onPerformSync()日志并不总是启动。因为有时候我会想象它是正确设置的。但我不知道发生了什么,当它没有 onPerformSync() GCM消息

我为我的应用程序构建了一个
SyncAdapter
,这样我就可以使用谷歌云消息触发数据库与服务器的同步。我使用截击来实际拨打网络电话并同步数据,但根据我在想同步你的应用时读到的信息,你应该有一个
SyncAdapter

我的问题是,
onPerformSync()
并不总是运行。我将启动GCM,我总是会收到一个日志,说明它正确地通过了GCM,但是我的
onPerformSync()
日志并不总是启动。因为有时候我会想象它是正确设置的。但我不知道发生了什么,当它没有

onPerformSync()

GCM消息处理程序中的onMessageReceived()

@Override
public void onMessageReceived(String from, Bundle data) {

    if (from.equals("/topics/global")) {
        Log.d("gcm topics", data.getString("message"));
        try {
            if (data.getString("message").equals("update")) {
                Log.d("is update", "is message update");
                Account newAccount = new Account(ACCOUNT, ACCOUNT_TYPE);
                ContentResolver.requestSync(newAccount, AUTHORITY, data);
            }
        } catch (NullPointerException e) {
            Log.e("GCM", e.toString());
        }

    } else {
        String message = data.getString("message");
        createNotification(from, message);
    }
}
在MainActivity中创建帐户

public static Account createSyncAccount(Context context) {
    // Create the account type and default account
    Account newAccount = new Account(
            ACCOUNT, ACCOUNT_TYPE);
    // Get an instance of the Android account manager
    AccountManager accountManager =
            (AccountManager) context.getSystemService(
                    ACCOUNT_SERVICE);
    /*
     * Add the account and account type, no password or user data
     * If successful, return the Account object, otherwise report an error.
     */
    if (accountManager.addAccountExplicitly(newAccount, null, null)) {
        /*
         * If you don't set android:syncable="true" in
         * in your <provider> element in the manifest,
         * then call context.setIsSyncable(account, AUTHORITY, 1)
         * here.
         */
        ContentResolver.setIsSyncable(newAccount, ArmyContract.CONTENT_AUTHORITY, 1);
        ContentResolver.setSyncAutomatically(newAccount, ArmyContract.CONTENT_AUTHORITY, true);

        return newAccount;
    } else {
        /*
         * The account exists or some other error occurred. Log this, report it,
         * or handle it internally.
         */
        Log.e("Account Creation", "Error withou dummy accocunt");
        return null;
    }
}
公共静态帐户createSyncAccount(上下文){
//创建帐户类型和默认帐户
帐户newAccount=新帐户(
账户,账户类型);
//获取Android帐户管理器的实例
会计经理会计经理=
(AccountManager)context.getSystemService(
账户服务);
/*
*添加帐户和帐户类型,无密码或用户数据
*如果成功,则返回Account对象,否则报告错误。
*/
if(accountManager.addaccountexplicified(newAccount,null,null)){
/*
*如果未在中设置android:syncable=“true”
*在清单中的元素中,
*然后调用context.setIsSyncable(account,AUTHORITY,1)
*在这里。
*/
ContentResolver.setIsSyncable(新帐户,ArmyContract.CONTENT\u权限,1);
ContentResolver.setsyncutomatically(newAccount,ArmyContract.CONTENT\u AUTHORITY,true);
返回新帐户;
}否则{
/*
*帐户存在或发生了其他错误。请记录、报告此错误,
*或者内部处理。
*/
Log.e(“账户创建”,“虚拟账户错误”);
返回null;
}
}
syncadapter.xml

<?xml version="1.0" encoding="utf-8"?>
<sync-adapter
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:contentAuthority="com.clashtoolkit.clashtoolkit"
    android:accountType="clashtoolkit.com"
    android:userVisible="false"
    android:supportsUploading="false"
    android:allowParallelSyncs="false"
    android:isAlwaysSyncable="true"/>

authenticator.xml

<?xml version="1.0" encoding="utf-8"?>
<account-authenticator
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:accountType="clashtoolkit.com"
    android:icon="@mipmap/ic_launcher"
    android:smallIcon="@mipmap/ic_launcher"
    android:label="@string/app_name"/>

AndroidManifext.xml

<uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
<uses-permission android:name="android.permission.READ_SYNC_SETTINGS"/>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<permission android:name="com.clashtoolkit.clashtoolkit.permission.C2D_MESSAGE"
    android:protectionLevel="signature" />
<uses-permission android:name="com.clashtoolkit.clashtoolkit.permission.C2D_MESSAGE" />
<service
        android:name="com.clashtoolkit.clashtoolkit.network.AuthenticatorService">
        <intent-filter>
            <action android:name="android.accounts.AccountAuthenticator"/>
        </intent-filter>
        <meta-data
            android:name="android.accounts.AccountAuthenticator"
            android:resource="@xml/authenticator" />
    </service>
    <service
        android:name="com.clashtoolkit.clashtoolkit.network.SyncService"
        android:exported="true"
        android:process=":sync">
        <intent-filter>
            <action android:name="android.content.SyncAdapter"/>
        </intent-filter>
        <meta-data android:name="android.content.SyncAdapter"
            android:resource="@xml/syncadapter" />
    </service>

问题可能在于将这些键添加到捆绑数据中:

// Disable sync backoff and ignore sync preferences. In other words...perform sync NOW!
        data.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true);
        data.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, true);
        ContentResolver.requestSync(newAccount, AUTHORITY, data);

问题可能在于将这些键添加到捆绑数据中:

// Disable sync backoff and ignore sync preferences. In other words...perform sync NOW!
        data.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true);
        data.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, true);
        ContentResolver.requestSync(newAccount, AUTHORITY, data);


您应该提供与同步适配器相关的xml文件。好的,在中添加了该文件。如果需要任何其他信息,请告诉我。谢谢。当你手动发射它时,它总是工作吗?您可以通过Android设置->帐户->应用程序名->菜单->立即同步(或通过在此处关闭和打开适配器)来完成此操作。我的设备上的“立即同步”按钮变灰。看起来很多应用都是这样的。除了这些设置中的“删除”之外,没有其他选项。我已在手机上启用自动同步。您应该提供与同步适配器相关的xml文件。好的,在中添加了该文件。如果需要任何其他信息,请告诉我。谢谢。当你手动发射它时,它总是工作吗?您可以通过Android设置->帐户->应用程序名->菜单->立即同步(或通过在此处关闭和打开适配器)来完成此操作。我的设备上的“立即同步”按钮变灰。看起来很多应用都是这样的。除了这些设置中的“删除”之外,没有其他选项。我的手机已启用自动同步功能,但我不确定是否遵循。您的
getAccount()
返回的内容与我在
onMessageReceived()
中所做的相同,因此
requestSync()
的输入是相同的。您在模拟器上看到多少个帐户?你能发布SyncAdapter代码吗?我正在使用我的手机,所以我有其他的应用程序。就应用程序而言,只有一个dummyaccount。这个问题会出现在android中吗:allowParallelSyncs=“true”?你试过把它改成真的吗?并将android:accountType=“clashtoolkit.com”更改为android:accountType=“com.clashtoolkit.clashtoolkit”或其定义的文件夹。由于问题并非总是发生,很难达到100%,但这似乎解决了我的问题。我等了几天,经历了不少考验,所以看起来我很好。因此,我将继续并标记为已接受。如果有什么变化,我会回来报告。谢谢你的帮助!我不太明白。您的
getAccount()
返回的内容与我在
onMessageReceived()
中所做的相同,因此
requestSync()
的输入是相同的。您在模拟器上看到多少个帐户?你能发布SyncAdapter代码吗?我正在使用我的手机,所以我有其他的应用程序。就应用程序而言,只有一个dummyaccount。这个问题会出现在android中吗:allowParallelSyncs=“true”?你试过把它改成真的吗?并将android:accountType=“clashtoolkit.com”更改为android:accountType=“com.clashtoolkit.clashtoolkit”或其定义的文件夹。由于问题并非总是发生,很难达到100%,但这似乎解决了我的问题。我等了几天,经历了不少考验,所以看起来我很好。因此,我将继续并标记为已接受。如果有什么变化,我会回来报告。谢谢你的帮助!