[英]VFY: unable to resolve static method 10876: Android
我在我的程序中使用了SmsCbMessage.java類。 它取自http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.0.1_r1/android/telephony/SmsCbMessage.java#SmsCbMessage以下是我的程序。
package com.android.internal.telephony;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsCbMessage;
import android.widget.Toast;
public class MainActivity extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//---get the CB message passed in---
Bundle bundle = intent.getExtras();
SmsCbMessage[] msgs = null;
String str = "";
if (bundle != null) {
//---retrieve the SMS message received---
Object[] pdus = (Object[]) bundle.get("pdus");
msgs = new SmsCbMessage[pdus.length];
for (int i=0; i<msgs.length; i++) {
msgs[i] = SmsCbMessage.createFromPdu((byte[])pdus[i]);
str += "CB lang " + msgs[i].getLanguageCode();
str += " :";
str += msgs[i].getMessageBody().toString();
str += "\n";
}
//---display the new CB message---
abortBroadcast();
Toast.makeText(context, str, Toast.LENGTH_SHORT).show();
}
}
}
這編譯沒有錯誤。 但運行時會出現以下錯誤
06-21 23:32:43.530 1951-1951/com.example.samitha.cbmessagespro I/dalvikvm﹕ Could not find method android.telephony.SmsCbMessage.createFromPdu, referenced from method com.android.internal.telephony.MainActivity.onReceive
06-21 23:32:43.530 1951-1951/com.example.samitha.cbmessagespro W/dalvikvm﹕ VFY: unable to resolve static method 10876: Landroid/telephony/SmsCbMessage;.createFromPdu ([B)Landroid/telephony/SmsCbMessage;
06-21 23:32:43.530 1951-1951/com.example.samitha.cbmessagespro W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x41784c68)
06-21 23:32:45.580 1951-1951/com.example.samitha.cbmessagespro I/Process﹕ Sending signal. PID: 1951 SIG: 9
怎么解決這個?
並非我在使用SmsCbMessage.java類時也包含了所有必需的依賴類。
如果你看一下SmsCbMessage@android.googlesource.com的源代碼
您將看到該類標有“@hide”屬性
/*
* ....
* @hide
*/
public class SmsCbMessage implements Parcelable {...
這意味着該類是android的實現細節,它不是公共android api的一部分,可以更改或刪除,恕不另行通知。
SmsCbMessage@android.googlesource.com熱門的方法是public static SmsCbMessage createFromPdu(byte[] pdu)
而你的codefragment確實擁有它。
您的測試設備確實有這個類但沒有靜態方法。
如果您仍想使用該類,可以將源代碼添加到項目中並重命名該包
[更新2015-06-25]
因為從grepcodes添加源到本地項目不能解決問題,因為它有許多依賴項(特別是android.internal。*)
您可以創建自己的MySmsCbMessage,它繼承自設備SmsCbMessage類,並嘗試從grepcodes源添加缺少的函數。
public class MySmsCbMessage extends SmsCbMessage {
public static SmsCbMessage createFromPdu(byte[] pdu) {
try {
return new MySmsCbMessage(pdu);
} catch (IllegalArgumentException e) {
Log.w(LOG_TAG, "Failed parsing SMS-CB pdu", e);
return null;
}
}
}
這仍然是一個脆弱的解決方法,因為您不能避免其他設備將具有SmsCbMessage
華為很可能已經定制了SmsCbMessage
類。 你可以做的是使用反射來查看該類可用的方法,並希望它看起來像你需要的那個。 嘗試這樣的事情:
try {
Class clazz = Class.forName("android.telephony.SmsCbMessage");
Method[] methods = clazz.getDeclaredMethods();
for (Method m : methods) {
Log.v("XXX", "Method found: " + m);
}
} catch (Exception e) {
Log.e("XXX", "Exception: " + e);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.