最新消息:20210917 已从crifan.com换到crifan.org

【未解决】rcsjta的RI启动报错:Cannot connect service API Failed to get result for com.gsma.services.rcs.action.GET_SERVICE_STARTING_STATE

Service crifan 363浏览 0评论
折腾:
【未解决】Android Studio去红米Note8Pro中调试rcsjta的RI的apk
期间,通过rcsjta的log日志发现,RI中会报错和rcs的api连不上的log。
感觉是和RCS服务无法启动最有关系。
所以去研究看看。
去看看日志,逻辑是:
2020-08-06 10:17:47.438 10088-10088/com.gsma.rcs.ri D/[RI][RcsServiceNotifManager]: Service started
启动服务
2020-08-06 10:17:47.465 10088-10088/com.gsma.rcs.ri D/[RI][RcsServiceNotifManager]: Try to connect to service API
然后没有连接上,而报错:
2020-08-06 10:17:47.468 10088-10088/com.gsma.rcs.ri W/[RI][RcsServiceNotifManager]: Cannot connect service API: Failed to get result for com.gsma.services.rcs.action.GET_SERVICE_STARTING_STATE!
去找上面的intent
libs/api/src/main/java/com/gsma/services/rcs/Intents.java
        /**
         * Intent to get the RCS service starting state.
         */
        public static final String ACTION_GET_SERVICE_STARTING_STATE = "com.gsma.services.rcs.action.GET_SERVICE_STARTING_STATE";


        /**
         * Used as a boolean extra field in ACTION_GET_SERVICE_STARTING_STATE intent to convey the
         * response.
         */
        public static final String EXTRA_GET_SERVICE_STARTING_STATE = "get_service_starting_state";
然后调用的地方:
libs/api/src/main/java/com/gsma/services/rcs/RcsServiceControl.java
    /**
     * Returns true if the RCS stack is started.
     *
     * @return boolean true if the RCS stack is started.
     * @throws RcsGenericException
     */
    public boolean isServiceStarted() throws RcsGenericException {
        if (sAccurateLog) {
            Log.d(LOG_TAG, "isServiceStarted: Request()");
        }
        Bundle result = queryRcsStackByIntent(new Intent(
                Intents.Service.ACTION_GET_SERVICE_STARTING_STATE));
        boolean started = result
                .getBoolean(Intents.Service.EXTRA_GET_SERVICE_STARTING_STATE, false);
        if (sAccurateLog) {
            Log.d(LOG_TAG,
                    "isServiceStarted: Response() -> " + started + " (in "
                            + result.getLong(TIME_SPENT, -1) + "ms)");
        }
        return started;
    }
是判断服务是否启动的地方。
然后看了看,小米9和红米Note8Pro的 RI 都有此错误:
for_debug/XiaoMi9/rcsjta_RI_20200806.log
2020-08-06 10:31:44.472 4308-4308/com.gsma.rcs.ri W/[RI][RcsServiceNotifManager]: Cannot connect service API: Failed to get result for com.gsma.services.rcs.action.GET_SERVICE_STARTING_STATE!
for_debug/RedmiNote8Pro/rcsjta_RI_20200806.log
2020-08-06 10:17:47.468 10088-10088/com.gsma.rcs.ri W/[RI][RcsServiceNotifManager]: Cannot connect service API: Failed to get result for com.gsma.services.rcs.action.GET_SERVICE_STARTING_STATE!
继续研究代码和逻辑。
搜:isServiceStarted
看到有个
core/src/com/gsma/rcs/service/RcsServiceControlReceiver.java
                    case Intents.Service.ACTION_GET_SERVICE_STARTING_STATE:
                        Core core = Core.getInstance();
                        boolean started = core != null && core.isStarted();
                        mResult.putBoolean(Intents.Service.EXTRA_GET_SERVICE_STARTING_STATE,
                                started);
                        if (sAccurateLog && sLogger.isActivated()) {
                            sLogger.debug("isServiceStarted() -> " + started);
                        }
                        break;
其中的sAccurateLog
看起来像是 是否开启更加精确的log
去找找如何开启
这样可以输出更多日志,便于找到出错原因
有2处用到这个
core/src/com/gsma/rcs/service/RcsServiceControlReceiver.java
public class RcsServiceControlReceiver extends BroadcastReceiver {

    private static boolean sAccurateLog = false;
libs/api/src/main/java/com/gsma/services/rcs/RcsServiceControl.java
public class RcsServiceControl {


    private static final boolean sAccurateLog = false;
分别都去改为true:
libs/api/src/main/java/com/gsma/services/rcs/RcsServiceControl.java
    // private static final boolean sAccurateLog = false;
    private static final boolean sAccurateLog = true;
core/src/com/gsma/rcs/service/RcsServiceControlReceiver.java
    // private static boolean sAccurateLog = false;
    private static boolean sAccurateLog = true;
然后重新编译和调试,看看log输出如何
应该是重新编译
不过看到有个:Apply Code Changes
和Apply Changes and Restart Activity
只是重启activity,算了,还是整个项目重新编译和调试
不过重新编译期间,决定还是先去:
【未解决】Android Studio中gradle编译rcjsta项目多个使用或覆盖了已过时的API等报错
暂时先不去解决warning警告了,因为太多了。
而且很耗时,所以暂告一段落。
先回头看看能否解决此处的
com.gsma.services.rcs.action.GET_SERVICE_STARTING_STATE
的问题。如果能解决。就不用浪费时间解决api的兼容性问题了。
继续分析代码
看起来是:
core.isStarted()
是重点
src/com/gsma/rcs/core/Core.java
/**
 * Is core started
 * 
 * @return Boolean
 */
public boolean isStarted() {
    return mStarted;
}
再去找,有哪些地方处理了mStarted
是这里
/**
 * Start the terminal core
 */
public synchronized void startCore() {
    if (mStarted) {
        return;
    }
    mImsModule.start();
    mAddressBookManager.start();
    mLocaleManager.start();
    mListener.onCoreLayerStarted();


    mStarted = true;
    if (sLogger.isActivated()) {
        sLogger.info("RCS core service has been started with success");
    }
}
以及停止:
/**
 * Stop the terminal core
 * 
 * @throws PayloadException
 * @throws NetworkException
 * @throws ContactManagerException
 */
private void stopCore() throws PayloadException, NetworkException, ContactManagerException {
    if (!mStarted) {
        return;
    }
    mStopping = true;
    boolean logActivated = sLogger.isActivated();
    if (logActivated) {
        sLogger.info("Stop the RCS core service");
    }
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
        mBackgroundHandler.getLooper().quitSafely();
    } else {
        mBackgroundHandler.getLooper().quit();
    }
    mLocaleManager.stop();
    mAddressBookManager.stop();
    mImsModule.stop();


    mStopping = false;
    mStarted = false;
    if (logActivated) {
        sLogger.info("RCS core service has been stopped with success");
    }
    sInstance = null;
    mListener.onCoreLayerStopped();
}
其中start部分中,成功的话,会输出
RCS core service has been started with success
去找找之前log中,是否有
RCS core service
相关的log
 没有,不过代码中找到一些
包括
core/src/com/gsma/rcs/service/RcsCoreService.java
/**
 * RCS core service. This service offers a flat API to any other process (activities) to access to
 * RCS features. This service is started automatically at device boot.
 * 
 * @author Jean-Marc AUFFRET
 */
public class RcsCoreService extends Service implements CoreListener {
说是:设备启动时就启动了。
所以感觉应该去:
加断点去调试,不论是RI还是core,应该能运行到断点才对
去试试
再去看第一个IMS的:
src/com/gsma/rcs/core/ims/ImsModule.java
/**
 * Start the IMS module
 */
public void start() {
    if (sLogger.isActivated()) {
        sLogger.info("Start the IMS module");
    }
    mCnxManager.start();
    mExtensionManager.start();
    mServiceDispatcher.start();
    mCallManager.start();
    if (sLogger.isActivated()) {
        sLogger.info("IMS module is started");
    }
}
再去看第一个mCnxManager
src/com/gsma/rcs/core/ims/network/ImsConnectionManager.java
/**
 * Starts IMS connection manager
 */
public void start() {
    if (mNetworkStateListener == null) {
        /* Register network state listener */
        mNetworkStateListener = new NetworkStateListener();
        mCtx.registerReceiver(mNetworkStateListener, new IntentFilter(
                ConnectivityManager.CONNECTIVITY_ACTION));
    }
    if (mBatteryLevelListener == null) {
        /* Register changes about battery: charging state, level, etc... */
        mBatteryLevelListener = new BatteryLevelListener();
        mCtx.registerReceiver(mBatteryLevelListener, new IntentFilter(
                Intent.ACTION_BATTERY_CHANGED));
    }
}
还是去加断点调试吧
以及:
src/com/gsma/rcs/core/Core.java
private Core(Context ctx, CoreListener listener, ContentResolver contentResolver,
        LocalContentResolver localContentResolver, RcsSettings rcsSettings,
        ContactManager contactManager, MessagingLog messagingLog, HistoryLog historyLog,
        RichCallHistory richCallHistory) {
    boolean logActivated = sLogger.isActivated();
。。。
public synchronized void startCore() {
    if (mStarted) {
        return;
    }
    mImsModule.start();
。。。
去调试看看
然后去看看:
【未解决】Android项目rcsjta中如何才能运行到rcs的core的service

转载请注明:在路上 » 【未解决】rcsjta的RI启动报错:Cannot connect service API Failed to get result for com.gsma.services.rcs.action.GET_SERVICE_STARTING_STATE

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
90 queries in 0.179 seconds, using 23.35MB memory