一、来电归属地没有出来

sprd\packages\apps\InCallUI\src\com\sprd\incallui\geocode\GeocodeHelper.java
private static final String KEY = "ro.device.support.geocode";
private static final boolean SUPPORT_SPRD_GROCODE = SystemProperties.getBoolean(KEY, true) && (OperatorUtils.IS_CMCC || OperatorUtils.IS_CUCC);
//SystemProperties.getBoolean(KEY, true),获取ro.device.support.geocode的属性值默认为true
//(OperatorUtils.IS_CMCC || OperatorUtils.IS_CUCC):这个sprd本意实现是想判断是联通还是移动,实际打log出来插入移动 OperatorUtils.IS_CMCC获取的值也是false.
private static final boolean SUPPORT_SPRD_GROCODE = SystemProperties.getBoolean(KEY, true); //zxw modify

二、按照一的做了,还是没有出来,

sprd\packages\apps\InCallUI\src\com\android\incallui\CallCardFragment.java@Overridepublic void onViewCreated(View view, Bundle savedInstanceState) {super.onViewCreated(view, savedInstanceState);.../* SPRD: for call geocode @ { */mGeocodeView = (TextView)view.findViewById(R.id.geocode);Log.d("zxw","setPrimary mGeocodeView = " + mGeocodeView);//打log发现mGeocodeView为空,没有显示来电归属地...}

那么在哪里加入mGeocodeView?
还在CallCardFragment.java,onCreateView有加载layout文件

@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {super.onCreateView(inflater, container, savedInstanceState);mDensity = getResources().getDisplayMetrics().density;View view;// SPRD: add for Universe UIif(SprdUtils.PIKEL_UI_SUPPORT) {view = inflater.inflate(R.layout.call_card_sprd_pikel, container, false);mSimManager = SimManager.get(getActivity());} else if (SprdUtils.UNIVERSE_UI_SUPPORT){view = inflater.inflate(R.layout.call_card_sprd, container, false);mSimManager = SimManager.get(getActivity());} else {view = inflater.inflate(R.layout.call_card, container, false);}return view;}

后面通过分析是走的call_card_sprd_pikel.xml文件,然后在call_card_sprd_pikel.xml会搜到
layout="@layout/primary_call_info_sprd_pikel"/>
所以在primary_call_info_sprd_pikel.xml增加mGeocodeView 控件
sprd\packages\apps\InCallUI\res\layout\primary_call_info_sprd_pikel.xml
加在LinearLayout phoneNumber后面,其实后面发现这样加并不合理,因为屏的分辨率比较小,这样call的状态放到下面去了,看不到了。
后面改成callStateLabel和geocode用LinearLayout包起来,做一行显示

<TextView android:id="@+id/geocode"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:textColor="@color/incall_main_info_text_color_sprd"android:textSize="@dimen/call_status_text_size"android:singleLine="true"/>callStateLabel和geocode用LinearLayout包起来,做一行显示;
<RelativeLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:orientation="horizontal"><TextView android:id="@+id/geocode"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:textColor="@color/incall_main_info_text_color_sprd"android:textSize="@dimen/call_status_text_size"android:singleLine="true"/><TextView android:id="@+id/callStateLabel"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="@dimen/call_status_text_size"android:textColor="@color/incall_main_info_text_color_sprd"android:layout_marginRight="@dimen/call_button_margin_vertical"android:singleLine="true"android:ellipsize="end"/></LinearLayout><!-- Elapsed time indication for a call in progress. --><TextView android:id="@+id/elapsedTime"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textColor="@color/incall_main_info_text_color_sprd"android:singleLine="true"android:textSize="@dimen/call_status_text_size"android:visibility="gone"android:layout_toRightOf="@id/callStateLabel"/><!-- Call type indication: a special label and/or brandingfor certain kinds of calls (like "Internet call" for a SIP call.) --><TextView android:id="@+id/callTypeLabel"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textColor="@color/incall_main_info_text_color_sprd"android:maxLines="1"android:ellipsize="end"android:visibility="gone" /></RelativeLayout>

三、发现还是没有问题。

sprd\packages\apps\InCallUI\src\com\sprd\incallui\geocode\GeocodeHelper.java
public static void getGeocodeMessage(TextView view, String number) {if (isSupportSprdGeocode()) {Log.d(TAG,"zxw getGeocodeMessage number = " + number);if(!TextUtils.isEmpty(number)){GeocodeAsyncTask task = new GeocodeAsyncTask(view, number);task.execute();}} else {Log.w(TAG, " Can not support sprd geocode !");}}

加个log,发现number为空,导致TextUtils.isEmpty(number)为true,!TextUtils.isEmpty(number)为false,导致GeocodeAsyncTask异步线程没有跑进去。
调试时可以赋值一个number: number = new String(“13510678888”);

然后搜索GeocodeHelper,看在哪里会调用GeocodeHelper的getGeocodeMessage方法

sprd\packages\apps\InCallUI\src\com\android\incallui\CallCardFragment.java@Overridepublic void setPrimary(String number, String name, boolean nameIsNumber, String label,Drawable photo, boolean isConference, boolean isGeneric, boolean isSipCall,boolean isRealNoName, String googleGeocode) {Log.d(this, "Setting primary call");if (isConference) {name = getConferenceString(isGeneric);photo = getConferencePhoto(isGeneric);nameIsNumber = false;}Log.d("zxw","setPrimary mGeocodeView = " + mGeocodeView);/* SPRD: Modify for bug789304 @{ */if (mGeocodeView != null) {Log.d("zxw","setPrimary googleGeocode = " + googleGeocode + ",TextUtils.isEmpty(googleGeocode) = " + TextUtils.isEmpty(googleGeocode));if (!TextUtils.isEmpty(googleGeocode)){mGeocodeView.setVisibility(View.VISIBLE);mGeocodeView.setText(googleGeocode);} else if (GeocodeHelper.isSupportSprdGeocode()) {mGeocodeView.setVisibility(View.VISIBLE);GeocodeHelper.getGeocodeMessage(mGeocodeView, nameIsNumber ? name : number); //zxw }else {mGeocodeView.setVisibility(View.GONE);}}

其实在定义CallCardFragment时,

public class CallCardFragment extends BaseFragment<CallCardPresenter, CallCardPresenter.CallCardUi>implements CallCardPresenter.CallCardUi {sprd\packages\apps\InCallUI\src\com\android\incallui\CallCardPresenter.java 有CallCardUi接口的定义public interface CallCardUi extends Ui {void setVisible(boolean on);void setPrimary(String number, String name, boolean nameIsNumber, String label,Drawable photo, boolean isConference, boolean isGeneric, boolean isSipCall,boolean isRealNoName, String googleGeocode); //Modify for bug789304void setSecondary(boolean show, String name, boolean nameIsNumber, String label,Drawable photo, boolean isConference, boolean isGeneric);void setSecondary(boolean show, String number, String name, boolean nameIsNumber, String label,Drawable photo, boolean isConference, boolean isGeneric);void setSecondaryImage(Drawable image);//@orig setCallState(int, Call.DisconnectCause, boolean, String, String);void setCallState(int phoneId, int state, Call.DisconnectCause cause, boolean bluetoothOn,String gatewayLabel, String gatewayNumber);void setPrimaryCallElapsedTime(boolean show, String duration);void setPrimaryName(String name, boolean nameIsNumber, boolean isRealNoName);void setPrimaryImage(Drawable image);void setPrimaryPhoneNumber(String phoneNumber);void setPrimaryLabel(String label);void displayPhoneView(boolean show);}

在CallCardPresenter.java里会发现

private void updatePrimaryDisplayInfo(ContactCacheEntry entry, boolean isConference) {Log.d(TAG, "Update primary display " + entry);final CallCardUi ui = getUi();if (ui == null || mPrimary == null) {// TODO: May also occur if search result comes back after ui is destroyed. Look into// removing that case completely.Log.d(TAG, "updatePrimaryDisplayInfo called but ui or primary call is null!");return;}final boolean isGenericConf = isGenericConference(mPrimary);if (entry != null) {final String name = getNameForCall(entry);final String number = isConference ? mPrimary.getNumber() : getNumberForCall(entry);final String googleGeocode = getGeocodeForCall(entry);final boolean nameIsNumber = name != null && name.equals(entry.number);Log.d(TAG, "zxw updatePrimaryDisplayInfo number = " + number + ",nameIsNumber" + nameIsNumber + ",isConference" + isConference);ui.setPrimary(number, name, nameIsNumber, entry.label, entry.photo,isConference, isGenericConf, entry.isSipCall, entry.isRealNoName, googleGeocode);//zxw 调用CallCardFragment的setPrimary} else {ui.setPrimary(mPrimary.getNumber(), null, false, null, null, isConference,isGenericConf, false, false, null);}}

在CallCardPresenter.java里会发现,会发现因为已经用了sprd的来电归属,所以GeocodeHelper.isSupportGoogleGeocode()一直为false,没有传递contactInfo.number,而是一个name进去,这就是为什么在前面number为空。换成sprd的
private static String getNameForCall(ContactCacheEntry contactInfo) {
//if (TextUtils.isEmpty(contactInfo.name) && GeocodeHelper.isSupportGoogleGeocode()) {
if (TextUtils.isEmpty(contactInfo.name) && GeocodeHelper.isSupportSprdGeocode()) {//zxw modify
return contactInfo.number;
}
return contactInfo.name;
}

四,这个GeocodeAsyncTask任务跑起来了,但doInBackground里执行cursor = context.getContentResolver().query(uri, new String[] {
“province”, “city”
}, number, null, null);报错
D GecodeHelper: zxw doInBackground
01-01 08:02:58.829 1165 1941 W System.err: java.lang.SecurityException: Permission Denial: opening provider com.sprd.providers.geocode.GeocodeProvider from ProcessRecord{41c6e318 1165:com.android.incallui/u0a22} (pid=1165, uid=10022) that is not exported from uid 10012
01-01 08:02:58.829 1165 1941 W System.err: at android.os.Parcel.readException(Parcel.java:1465)
01-01 08:02:58.829 1165 1941 W System.err: at android.os.Parcel.readException(Parcel.java:1419)
01-01 08:02:58.829 660 715 D Settings: newValuesVersion = 15
01-01 08:02:58.829 1165 1941 W System.err: at android.app.ActivityManagerProxy.getContentProvider(ActivityManagerNative.java:2993)
01-01 08:02:58.829 660 715 D Settings: mValues.get(name) = null
01-01 08:02:58.829 1165 1941 W System.err: at android.app.ActivityThread.acquireProvider(ActivityThread.java:4735)
01-01 08:02:58.829 1165 1941 W System.err: at android.app.ContextImplApplicationContentResolver.acquireUnstableProvider(ContextImpl.java:2253)01−0108:02:58.82911651941WSystem.err:atandroid.content.ContentResolver.acquireUnstableProvider(ContentResolver.java:1425)01−0108:02:58.82911651941WSystem.err:atandroid.content.ContentResolver.query(ContentResolver.java:445)01−0108:02:58.82911651941WSystem.err:atandroid.content.ContentResolver.query(ContentResolver.java:404)01−0108:02:58.82911651941WSystem.err:atcom.sprd.incallui.geocode.GeocodeHelperApplicationContentResolver.acquireUnstableProvider(ContextImpl.java:2253) 01-01 08:02:58.829 1165 1941 W System.err: at android.content.ContentResolver.acquireUnstableProvider(ContentResolver.java:1425) 01-01 08:02:58.829 1165 1941 W System.err: at android.content.ContentResolver.query(ContentResolver.java:445) 01-01 08:02:58.829 1165 1941 W System.err: at android.content.ContentResolver.query(ContentResolver.java:404) 01-01 08:02:58.829 1165 1941 W System.err: at com.sprd.incallui.geocode.GeocodeHelperApplicationContentResolver.acquireUnstableProvider(ContextImpl.java:2253)01−0108:02:58.82911651941WSystem.err:atandroid.content.ContentResolver.acquireUnstableProvider(ContentResolver.java:1425)01−0108:02:58.82911651941WSystem.err:atandroid.content.ContentResolver.query(ContentResolver.java:445)01−0108:02:58.82911651941WSystem.err:atandroid.content.ContentResolver.query(ContentResolver.java:404)01−0108:02:58.82911651941WSystem.err:atcom.sprd.incallui.geocode.GeocodeHelperGeocodeAsyncTask.doInBackground(GeocodeHelper.java:69)
01-01 08:02:58.829 1165 1941 W System.err: at com.sprd.incallui.geocode.GeocodeHelper$GeocodeAsyncTask.doInBackground(GeocodeHelper.java:51)
01-01 08:02:58.829 1165 1941 W System.err: at android.os.AsyncTask2.call(AsyncTask.java:288)01−0108:02:58.829832979Ddalvikvm:GCFORALLOCfreed166K,1501−0108:02:58.82911651941WSystem.err:atjava.util.concurrent.FutureTask.run(FutureTask.java:237)01−0108:02:58.82911651941WSystem.err:atandroid.os.AsyncTask2.call(AsyncTask.java:288) 01-01 08:02:58.829 832 979 D dalvikvm: GC_FOR_ALLOC freed 166K, 15% free 3317K/3872K, paused 23ms, total 23ms 01-01 08:02:58.829 1165 1941 W System.err: at java.util.concurrent.FutureTask.run(FutureTask.java:237) 01-01 08:02:58.829 1165 1941 W System.err: at android.os.AsyncTask2.call(AsyncTask.java:288)01−0108:02:58.829832979Ddalvikvm:GCF​ORA​LLOCfreed166K,1501−0108:02:58.82911651941WSystem.err:atjava.util.concurrent.FutureTask.run(FutureTask.java:237)01−0108:02:58.82911651941WSystem.err:atandroid.os.AsyncTaskSerialExecutor1.run(AsyncTask.java:231)01−0108:02:58.82911651941WSystem.err:atjava.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)01−0108:02:58.82911651941WSystem.err:atjava.util.concurrent.ThreadPoolExecutor1.run(AsyncTask.java:231) 01-01 08:02:58.829 1165 1941 W System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 01-01 08:02:58.829 1165 1941 W System.err: at java.util.concurrent.ThreadPoolExecutor1.run(AsyncTask.java:231)01−0108:02:58.82911651941WSystem.err:atjava.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)01−0108:02:58.82911651941WSystem.err:atjava.util.concurrent.ThreadPoolExecutorWorker.run(ThreadPoolExecutor.java:587)
解决:

sprd\packages\providers\ContactsProvider\AndroidManifest.xml
<provider android:name="com.sprd.providers.geocode.GeocodeProvider"android:authorities="gecode_location"android:syncable="false" android:multiprocess="false"android:exported="true">  //之前android:exported="false",允许跨进程通信</provider>

五、读取数据库时,中文为乱码
(1)SQlite中存取的是中文字符时,直接使用cursor.getString读取数据,读出来的数据会出现乱码,此时需要进行一定的转换。
下面是一种有效的读取方法,先以二进制数据从SQLite中读出,再用uft-8对中文进行编码
byte[] procincetemp = cursor.getBlob(cursor.getColumnIndex(“province”));
byte[] citytemp = cursor.getBlob(cursor.getColumnIndex(“city”));
String procince = new String(procincetemp, “utf-8”);
String city = new String(citytemp, “utf-8”);

但是这样就可以正确地显示中文字符,而不是乱码。但需要注意一点就是,这种转换后的字符,结尾多了空格符,需要使用trim函数去除掉
procince = procince.trim();
city = city.trim();

(2)这种方法也可以解决中文字符串乱码
public static String toUtf8(String str) {
String temp = null;
try {
temp = new String(str.getBytes(“UTF-8”), “UTF-8”);
} catch (Exception e) {
e.printStackTrace();
}
return temp;
}
result = toUtf8(result); //将result中文乱码转化为utf-8

六、总结
sprd\packages\apps\InCallUI\src\com\sprd\incallui\geocode\GeocodeHelper.java: context.getContentResolver(…).query --> //context.getContentResolver的query
packages\providers\ContactsProvider\src\com\sprd\providers\geocode\GeocodeProvider.java: Cursor query(…) --> //GeocodeProvider的query
packages\providers\ContactsProvider\src\com\sprd\providers\geocode\GeocodeProvider.java: qb.query(…) //SQLiteQueryBuilder的query

sprd9820 来电归属地相关推荐

  1. Android 号码, 来电归属地 Jni 使用C++对二进制文件查询(一) 理论篇

    1.效果图 左边的是应用程序界面,只是做个测试.右边的是应用程序信息,你会发现数据这块很小,只有420KB,要知道里面有近280,000记录. 2.尝试使用sqlite数据库, 用db格式文件. 随便 ...

  2. 安卓来电归属地_HavocOS v3.5 (Android10) ROM 使用体验,带你探索原生安卓的魅力!...

    扫描二维码 获取更多精彩 云飞科技站 今天我又带来另一款原生类ROM的使用体验--Havoc-OS v3.5 (Android10) ROM. Havoc-OS是一款基于AOSP源代码编译制作的ROM ...

  3. IOS 完成来电归属地

    首先是一个库:(有时间在上传) 然后设置一个工具类 .h 1 @interface HMFoundLocation : NSObject 2 3 AS_SINGLETON(HMFoundLocatio ...

  4. 来电归属地java_来电归属地数据查询Java实现

    项目需要实现来电归属地查询,所以就找到了下面这个文章 原理主要在(一)和(二)中,作者的数据压缩思路很给力,将6M的原始文本数据压缩到400kb左右,原作者已经将分析讲的很清楚了,这里提炼一下要点,并 ...

  5. 40_显示来电归属地,监听来电状态的服务

    一.service中 private TelephonyManager tm; @Override public void onCreate() { // 注册一个电话状态的监听器. tm = (Te ...

  6. Android 系统(254)---Android libphonenumber Demo 手机号码归属地

    Android libphonenumber Demo 手机号码归属地 libphonenumber 是google 开源的库,提供手机号码格式化,来电归属地,运营商等多种功能十分强大,现在做个简单的 ...

  7. android来电归属地提醒

    现在市面上常用的一些拨号软件的一个功能,来电归属地.拨号的时候,会在拨号界面出现一个号码归属地的小框框.效果如下:而且这个小窗体还可以自定义风格,并且可以自由移动.这里大概讲下实现的过程. 这个小框框 ...

  8. Android libphonenumber Demo 手机号码归属地

    libphonenumber 是google 开源的库,提供手机号码格式化,来电归属地,运营商等多种功能十分强大,现在做个简单的demo 1.首先下载 libphonumber 相关的库 here,  ...

  9. Android8.1 MTK平台 Dialer修改(来电全屏、归属地显示)

    来电默认全屏 默认情况下,来电android是以通知窗口的形式显示,只在屏幕的顶部显示,现在改为全屏显示 修改位置 alps\vendor\mediatek\proprietary\packages\ ...

最新文章

  1. swift4 attributedText简单使用以及改变链接字体颜色
  2. java注释@para_Java中文档注释各字段的含义是什么?例如author表示作者,para表示参数等...
  3. 摘抄--apache工作模式详解
  4. shell之sed 记录
  5. hibernate常见错误及解决方法总结
  6. 开发DBA(APPLICATION DBA)的重要性
  7. 阿里开发规范文档_华为阿里等技术专家15年开发经验总结:SSM整合开发实战文档...
  8. 原子微型结构信息应用到局部图形信息存储的猜想
  9. 前端学习(2368):编程式导航
  10. 798B. Mike and strings
  11. 一个列中多行求和_excel表格制作,Excel表格的基本操作,包含制作一个表格10方面的知识(1)...
  12. jmeter接口测试----8用户定义的变量
  13. python2与pyrhon3的区别,python—文件操作,函数练习题
  14. [渝粤教育] 西南科技大学 材料力学 在线考试复习资料
  15. 计算机主机内部的结构,台式电脑主机内部结构介绍
  16. 考研复试问题之数据库概论
  17. shell脚本实现网络连接的检测
  18. matplotlib入门基础(五)轴坐标范围 轴刻度比例 轴刻度
  19. Vue ElementUI table给表格一个斜线分隔线
  20. edg击败we视频_edg击败we视频_LPL夏季赛:EDG零封V5获三连胜 OMG2-1击败WE

热门文章

  1. 建一个网站需要多少钱
  2. 2019/2/13打印华氏温度与摄氏温度对照表
  3. 如何禁止搜索引擎收录WordPress站点某个分类的文章?
  4. 微信开放平台注册和添加应用操作指南
  5. python定量城市研究_Python定量城市研究实战
  6. 光通信的再思考:5G流量爆发下的数据密度革命
  7. 爬虫模式-JAVA获取省市区编码
  8. 测试工作流程图,你一定要知道的
  9. ictclas4j java_Paoding, Ik, Jeasy, Ictclas4j分词工具
  10. 3D建模京东商品3D展示怎么做?