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

【已解决】rcsjta项目编译出错:MultimediaMessagingSessionListenerImpl.java使用或覆盖了已过时的API

Java crifan 670浏览 0评论
折腾:
【未解决】Android Studio中gradle编译rcjsta项目多个使用或覆盖了已过时的API等报错
期间,先去解决第一个错误
> Task :api:compileDebugJavaWithJavac
注: /Users/xxx/dev/xxx/RCS/rcsjta/libs/api/src/main/java/com/gsma/services/rcs/extension/MultimediaMessagingSessionListenerImpl.java使用或覆盖了已过时的 API。
注: 有关详细信息, 请使用 -Xlint:deprecation 重新编译。
先去看看代码
找到了
src/main/java/com/gsma/services/rcs/extension/MultimediaMessagingSessionListenerImpl.java
public void onMessageReceived(ContactId contact, String sessionId, byte[] content) {
    mListener.onMessageReceived(contact, sessionId, content);
}
'onMessageReceived(com.gsma.services.rcs.contact.ContactId, java.lang.String, byte[])' is deprecated
找找原因
点击前面的 电灯泡提示
好像不应该去掉,而是要想办法修复
onMessageReceived is deprecated
android – FirebaseInstanceIdService is deprecated – Stack Overflow
Migrate your GcmListenerService  |  Cloud Messaging  |  Google Developers
Update your GcmListenerService
Change MyGcmListenerService.java to extend FirebaseMessagingService and update the signature of the method onMessageReceived(). This example updates the service name to MyFcmListenerService. This is the same class used for token management. If you are also migrating a class extending InstanceIDListenerServicethese will need to be combined into a single class.
之前
MyGcmListenerService.java Before
public class MyGcmListenerService extends GcmListenerService {
  @Override
  public void onMessageReceived(String from, Bundle data){
    ...
  }


  ...
}
现在MyFcmListenerService.java After
public class MyFcmListenerService extends FirebaseMessagingService {
  @Override
  public void onMessageReceived(RemoteMessage message){
    String from = message.getFrom();
    Map data = message.getData();
  }
  ...
}
去找找具体实现
src/main/java/com/gsma/services/rcs/extension/MultimediaMessagingSessionListener.java
/**
 * Callback called when a multimedia message or data is received.
 * 
 * @deprecated Use
 *             {@link #onMessageReceived(ContactId contact, String sessionId, byte[] content, String contentType)}
 *             instead.
 * @param contact Contact ID
 * @param sessionId Session ID
 * @param content Message content
 */
@Deprecated
public abstract void onMessageReceived(ContactId contact, String sessionId, byte[] content);
看到有提示了:
希望改用
onMessageReceived(ContactId contact, String sessionId, byte[] content, String contentType)
果然同文件中,就有对应定义:
/**
 * Callback called when a multimedia message or data is received.
 *
 * @param contact Contact ID
 * @param sessionId Session ID
 * @param content Message content
 * @param contentType Message content type
 */
public abstract void onMessageReceived(ContactId contact, String sessionId, byte[] content,
        String contentType);
去尝试修改。
不过要去搞清楚,java中如何把 byte[] 转换为String
看错了,没有要求转换的,只是新增了参数contentType
搜:contentType
搜到很多内容
后来注意到
src/main/java/com/gsma/services/rcs/extension/MultimediaMessagingSessionListenerImpl.java
public void onMessageReceived2(ContactId contact, String sessionId, byte[] content, String contentType) {
    mListener.onMessageReceived(contact, sessionId, content, contentType);
}
已经是实现了上述推荐的,另外一个函数的调用。
去搜索看,是否有调用过onMessageReceived2
是有的
但是暂时没法搞懂内部细节
去看看旧函数onMessageReceived有哪些调用
搜到了几处调用:
然后进去看看:
src/com/gsma/rcs/service/broadcaster/MultimediaMessagingSessionEventBroadcaster.java
public void broadcastMessageReceived(ContactId contact, String sessionId, byte[] message, String contentType) {
    final int N = mMultimediaMessagingListeners.beginBroadcast();
    for (int i = 0; i < N; i++) {
        try {
            mMultimediaMessagingListeners.getBroadcastItem(i).onMessageReceived(contact,
                    sessionId, message);
里面是有额外的contentType参数的
-》理论上可以去修改掉用新接口的
剩下2个,都是build下面的,是编译生成的。可以忽略。不算调用。
然后去修改
src/com/gsma/rcs/service/broadcaster/MultimediaMessagingSessionEventBroadcaster.java
    public void broadcastMessageReceived(ContactId contact, String sessionId, byte[] message, String contentType) {
        final int N = mMultimediaMessagingListeners.beginBroadcast();
        for (int i = 0; i < N; i++) {
            try {
//                mMultimediaMessagingListeners.getBroadcastItem(i).onMessageReceived(contact, sessionId, message);
                mMultimediaMessagingListeners.getBroadcastItem(i).onMessageReceived2(contact, sessionId, message, contentType);
重新编译
试试:Apply code changes
触发build,log是:
Executing tasks: [:RI:assembleDebug] in project /Users/xxx/dev/xxx/RCS/rcsjta


> Task :api:preBuild UP-TO-DATE
> Task :api:preDebugBuild UP-TO-DATE
> Task :api:compileDebugAidl UP-TO-DATE
> Task :api:compileDebugRenderscript NO-SOURCE
> Task :api:generateDebugBuildConfig UP-TO-DATE
> Task :api:generateDebugResValues UP-TO-DATE
> Task :api:generateDebugResources UP-TO-DATE
> Task :api:packageDebugResources UP-TO-DATE
> Task :api:parseDebugLocalResources UP-TO-DATE
> Task :api:processDebugManifest UP-TO-DATE
> Task :api:generateDebugRFile UP-TO-DATE
> Task :api:javaPreCompileDebug UP-TO-DATE
> Task :api:compileDebugJavaWithJavac UP-TO-DATE
> Task :api:bundleLibCompileToJarDebug UP-TO-DATE
> Task :api_cnx:preBuild UP-TO-DATE
> Task :api_cnx:preDebugBuild UP-TO-DATE
> Task :api_cnx:compileDebugAidl NO-SOURCE
> Task :api:packageDebugRenderscript NO-SOURCE
> Task :api_cnx:compileDebugRenderscript NO-SOURCE
> Task :api_cnx:generateDebugBuildConfig UP-TO-DATE
> Task :api_cnx:generateDebugResValues UP-TO-DATE
> Task :api_cnx:generateDebugResources UP-TO-DATE
> Task :api_cnx:packageDebugResources UP-TO-DATE
> Task :api_cnx:parseDebugLocalResources UP-TO-DATE
> Task :api_cnx:processDebugManifest UP-TO-DATE
> Task :api_cnx:generateDebugRFile UP-TO-DATE
> Task :api_cnx:javaPreCompileDebug UP-TO-DATE
> Task :api_cnx:compileDebugJavaWithJavac UP-TO-DATE
> Task :api_cnx:bundleLibCompileToJarDebug UP-TO-DATE
> Task :mediaplayer:preBuild UP-TO-DATE
> Task :mediaplayer:preDebugBuild UP-TO-DATE
> Task :mediaplayer:compileDebugAidl NO-SOURCE
> Task :mediaplayer:compileDebugRenderscript UP-TO-DATE
> Task :mediaplayer:generateDebugBuildConfig UP-TO-DATE
> Task :mediaplayer:generateDebugResValues UP-TO-DATE
> Task :mediaplayer:generateDebugResources UP-TO-DATE
> Task :mediaplayer:packageDebugResources UP-TO-DATE
> Task :mediaplayer:parseDebugLocalResources UP-TO-DATE
> Task :mediaplayer:processDebugManifest UP-TO-DATE
> Task :mediaplayer:generateDebugRFile UP-TO-DATE
> Task :mediaplayer:javaPreCompileDebug UP-TO-DATE
> Task :mediaplayer:compileDebugJavaWithJavac UP-TO-DATE
> Task :mediaplayer:bundleLibCompileToJarDebug UP-TO-DATE
> Task :RI:preBuild UP-TO-DATE
> Task :RI:preDebugBuild UP-TO-DATE
> Task :RI:compileDebugAidl NO-SOURCE
> Task :api_cnx:packageDebugRenderscript NO-SOURCE
> Task :mediaplayer:packageDebugRenderscript NO-SOURCE
> Task :RI:compileDebugRenderscript UP-TO-DATE
> Task :RI:generateDebugBuildConfig UP-TO-DATE
> Task :RI:javaPreCompileDebug UP-TO-DATE
> Task :api:compileDebugLibraryResources UP-TO-DATE
> Task :api_cnx:compileDebugLibraryResources UP-TO-DATE
> Task :mediaplayer:compileDebugLibraryResources UP-TO-DATE
> Task :RI:generateDebugResValues UP-TO-DATE
> Task :RI:generateDebugResources UP-TO-DATE
> Task :RI:mergeDebugResources UP-TO-DATE
> Task :api:extractDeepLinksDebug UP-TO-DATE
> Task :api_cnx:extractDeepLinksDebug UP-TO-DATE
> Task :mediaplayer:extractDeepLinksDebug UP-TO-DATE
> Task :RI:createDebugCompatibleScreenManifests UP-TO-DATE
> Task :RI:extractDeepLinksDebug UP-TO-DATE
> Task :RI:processDebugManifest
> Task :RI:processDebugResources
> Task :RI:compileDebugJavaWithJavac UP-TO-DATE
> Task :RI:compileDebugSources UP-TO-DATE
> Task :api:mergeDebugShaders UP-TO-DATE
> Task :api:compileDebugShaders NO-SOURCE
> Task :api:generateDebugAssets UP-TO-DATE
> Task :api:packageDebugAssets UP-TO-DATE
> Task :api_cnx:mergeDebugShaders UP-TO-DATE
> Task :api_cnx:compileDebugShaders NO-SOURCE
> Task :api_cnx:generateDebugAssets UP-TO-DATE
> Task :api_cnx:packageDebugAssets UP-TO-DATE
> Task :mediaplayer:mergeDebugShaders UP-TO-DATE
> Task :mediaplayer:compileDebugShaders NO-SOURCE
> Task :mediaplayer:generateDebugAssets UP-TO-DATE
> Task :mediaplayer:packageDebugAssets UP-TO-DATE
> Task :RI:mergeDebugShaders UP-TO-DATE
> Task :RI:compileDebugShaders NO-SOURCE
> Task :RI:generateDebugAssets UP-TO-DATE
> Task :RI:mergeDebugAssets UP-TO-DATE
> Task :api:processDebugJavaRes NO-SOURCE
> Task :api:bundleLibResDebug NO-SOURCE
> Task :api_cnx:processDebugJavaRes NO-SOURCE
> Task :api_cnx:bundleLibResDebug NO-SOURCE
> Task :mediaplayer:processDebugJavaRes NO-SOURCE
> Task :mediaplayer:bundleLibResDebug NO-SOURCE
> Task :RI:processDebugJavaRes NO-SOURCE
> Task :RI:mergeDebugJavaResource UP-TO-DATE
> Task :api_cnx:bundleLibRuntimeToJarDebug UP-TO-DATE
> Task :api:bundleLibRuntimeToJarDebug UP-TO-DATE
> Task :mediaplayer:bundleLibRuntimeToJarDebug UP-TO-DATE
> Task :RI:checkDebugDuplicateClasses UP-TO-DATE
> Task :RI:dexBuilderDebug UP-TO-DATE
> Task :RI:mergeExtDexDebug UP-TO-DATE
> Task :RI:mergeDexDebug UP-TO-DATE
> Task :api:mergeDebugJniLibFolders UP-TO-DATE
> Task :api:mergeDebugNativeLibs UP-TO-DATE
> Task :api:stripDebugDebugSymbols NO-SOURCE
> Task :api:copyDebugJniLibsProjectOnly UP-TO-DATE
> Task :api_cnx:mergeDebugJniLibFolders UP-TO-DATE
> Task :api_cnx:mergeDebugNativeLibs UP-TO-DATE
> Task :api_cnx:stripDebugDebugSymbols NO-SOURCE
> Task :api_cnx:copyDebugJniLibsProjectOnly UP-TO-DATE
> Task :mediaplayer:mergeDebugJniLibFolders UP-TO-DATE
> Task :mediaplayer:mergeDebugNativeLibs UP-TO-DATE
> Task :mediaplayer:stripDebugDebugSymbols NO-SOURCE
> Task :mediaplayer:copyDebugJniLibsProjectOnly UP-TO-DATE
> Task :RI:mergeDebugJniLibFolders UP-TO-DATE
> Task :RI:mergeDebugNativeLibs UP-TO-DATE


> Task :RI:stripDebugDebugSymbols UP-TO-DATE
WARNING: Compatible side by side NDK version was not found. Default is 21.0.6113669.
Compatible side by side NDK version was not found. Default is 21.0.6113669.


> Task :RI:validateSigningDebug UP-TO-DATE


> Task :RI:packageDebug
There are no .so files available to package in the APK for arm64-v8a.


> Task :RI:assembleDebug


BUILD SUCCESSFUL in 4s
75 actionable tasks: 3 executed, 72 up-to-date


Build Analyzer results available
然后貌似没了这个警告了?
然后完全重现编译项目看看效果是否一样。
问题依旧:
> Task :api:compileDebugJavaWithJavac
注: /Users/xxx/dev/xxx/RCS/rcsjta/libs/api/src/main/java/com/gsma/services/rcs/extension/MultimediaMessagingSessionListenerImpl.java使用或覆盖了已过时的 API。
注: 有关详细信息, 请使用 -Xlint:deprecation 重新编译。
那是以为
src/main/java/com/gsma/services/rcs/extension/MultimediaMessagingSessionListenerImpl.java
public void onMessageReceived(ContactId contact, String sessionId, byte[] content) {
    mListener.onMessageReceived(contact, sessionId, content);
}
还存在。
在clean project后,确认没人调用onMessageReceived后,可以把这段代码去掉了。
src/main/java/com/gsma/services/rcs/extension/MultimediaMessagingSessionListenerImpl.java
//    public void onMessageReceived(ContactId contact, String sessionId, byte[] content) {
//        mListener.onMessageReceived(contact, sessionId, content);
//    }
重新编译项目看看
结果又会报错:
rcsjta/libs/api/src/main/java/com/gsma/services/rcs/extension/MultimediaMessagingSessionListenerImpl.java:30: 错误: MultimediaMessagingSessionListenerImpl不是抽象的, 并且未覆盖IMultimediaMessagingSessionListener中的抽象方法onMessageReceived(ContactId,String,byte[])
public class MultimediaMessagingSessionListenerImpl extends
       ^
说你没实现抽象方法
那再去找找:
void onMessageReceived(
有多少具体实现的地方
看到另外一个
src/com/gsma/rcs/ri/extension/messaging/MessagingSessionView.java
@Override
public void onMessageReceived(ContactId contact, String sessionId, byte[] content) {
    // Deprecated since TAPI 1.6
}
其完全留空,且注释了:TAPI 1.6之后就过期了。
-》此处也可以这么操作:
src/main/java/com/gsma/services/rcs/extension/MultimediaMessagingSessionListenerImpl.java
    public void onMessageReceived(ContactId contact, String sessionId, byte[] content) {
        // Deprecated since TAPI 1.6
//        mListener.onMessageReceived(contact, sessionId, content);
    }
重新编译试试
另外再搜:
void onMessageReceived(ContactId
也就只有此处几处,没其他调用了:
然后重新编译就OK了。没了此处错误警告了:
> Task :api:compileDebugJavaWithJavac
【总结】
此处,TAPI 1.6之后,就废弃了此处的:
src/main/java/com/gsma/services/rcs/extension/MultimediaMessagingSessionListener.java
而改用了:
public abstract void onMessageReceived(ContactId contact, String sessionId, byte[] content,
        String contentType);
所以,此处别处有代码调用了上面废弃的函数,所以报错。
解决办法:
把上面废弃的(没有contentType参数的)onMessageReceived的所有调用的地方,改为(有contentType参数的)onMessageReceived,重新编译项目。即可去除错误警告。

转载请注明:在路上 » 【已解决】rcsjta项目编译出错:MultimediaMessagingSessionListenerImpl.java使用或覆盖了已过时的API

发表我的评论
取消评论

表情

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

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
92 queries in 0.186 seconds, using 23.41MB memory