通讯录安卓源码
⑴ 怎么查看Android sdk中的源码demo,apidemo跟Android的版本有关系...
1. Custom Dialog
Android支持自定义窗口的风格:
1)首先在资源里面建立style的value;
example:
drawable/filled_box.xml
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<padding android:left="10dp" android:top="10dp" android:right="10dp" android:bottom="10dp" />
2)设置当前activity的属性,两种方式:1.在manifest文件中给指定的activity增加属性
android:theme="@android:style/Theme.CustomDialog"。2.在程序中增加语句setTheme(R.style.Theme_CustomDialog);
PS1:如果只是将Acticity显示为默认的Dialog, 跳过第一步,只需要在manifest文中增加属性:android:theme="@android:style/Theme.Dialog"或者在程序中增加setTheme(android.R.style.Theme_Dialog).
PS2:其他创建Dialog的方法:创建app.Dialog类或者创建app.AlertDialog类。
Next Study:能不能在Activity已经打开以后动态修改当前Activity的风格?
在测试中发现,在onCreate()事件中增加setTheme(),必须在setContentView()之前,否则指定的Style不能生效
2.Custom Title
Android除了可以为指定的Activity设置显示风格,此外也可以为指定的Activity设置一些特效,比如自定义Title,没有Title的Activity或者增加一个ICON等。
有意思的一点是,这些特效并不是你想设置的时候就行设置,你需要在Activity显示之前向系统申请要显示的特效,这样才能在下面的程序中为这些特效进行设置。(这样是不是多此一举有待研究)
为一个Activity设置自定义Title的流程:
1)为自定义的Title建立一个layout(custom_title_1.xml)
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/screen"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:orientation="vertical">
<textview android:id="@+id/left_text" android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:text="Left" />
<textview android:id="@+id/right_text" android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:text="Right" />
2)为activity设定自定义Title特效并指定Title的layout:
在onCreate()事件中增加:
requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
setContentView(R.layout.custom_title);
getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.custom_title_1);
这三条语句的次序不能颠倒,依次为申请特效,创建view,设置特效属性。其中requestWindowFeature等价于getWindow().requestFeature()
3)在需要修改Title的地方,获取left_text或者right_text进行设置即可。
Next Study:Activity的其他显示特效
Window还有其他一些feature,比如FEATURE_CONTEXT_MENU,FEATURE_NO_TITLE,FEATURE_LEFT_ICON等,有待继续学习研究。
1. Forwarding
这个实现很简单,就是启动新的Activity或者Service后,增加一个finish()语句就可以了,这个语句会主动将当前 activity从历史stack中清除,这样back操作就不会打开当前activity。
做这个实验的时候,发现开发Android程序需要注意的一点小问题:增加新的activity时,不能只增加一个class,一定要记得要在manifest文件中增加该activity的描述。(这个简单的功能,未来google应该给增加吧)
“android:name中的点”意义:首先manifest会有一个默认指定的package属性,比如指定为"com.android.sample",如果我们增加的activity的实现也在这个package下,则android:name为实现的类名,这个类名前加不加点都没有关系,都会自动找到该实现,比如实现为forwardtarget,则android:name写成forwardtarget或者.forwardtarget都可以。唯一有区别的是,如果activity的实现是在默认包的子包里面,则前面这个点就尤为重要,比如activity的实现是com.android.sample.app.forwardtarget,则android:name必须写成.app.forwardtarget或者com.android.sample.app.forwardtarget。如果只写app.forwardtarget,通常编辑器就会提示该类找不到,但不巧的是,你恰好有一个类是app.forwardtarget,那你只有等着运行时报错吧。
所以建议养成习惯只要是默认package下面的类,无论是否是在子包里面,前面都要加上一个点,现在当前实现是在默认package下。
2.Persistent
这里的持久化其实就是本地配置文件的读写,实现方法是通过Activity.getPreferences(int)获取SharedPreferences对象,然后操作配置文件的读写,值得注意的是以下几点:
1)Activity.getPreferences(int mode)等价于Content.getSharedPreferences(String filename,int mode),这里面的filename就是当前class的名称,例如在PersistentTest类中调用getPreferences(0),等价于调用getPreferences("PersistentTest", 0)。如不想用class name做文件名,可以直接调用getSharedPreferences方法,自己指定配置文件的名称。
2)mode值的定义:
MODE_PRIVATE = 0,表示当前配置文件为私有文件,只有当前的应用可以访问。
MODE_WORLD_READABLE = 1,表示当前配置文件可以被其他应用读取。
MODE_WORLD_WRITEABLE = 2,表示当前配置文件可以被其他应用写入。
如果配置文件又想被人读又想被写人,怎么办呢,呵呵,当然是MODE_WORLD_READABLE&MODE_WORLD_WRITEABLE,真的怀疑设计android的人以前是做C/C++的。
3)SharedPreferences是个很有意思的实现,读取数据的时候,直接用get方法就可以了,可是写数据的时候,没用给set方法,呵呵,第一次用这个类一定会以为只能读不能写。如果要写数据的话,需要用editor()方法(为什么不是getEditor()呢?看来设计的人一定是做C/C++的)获取SharedPreferences.Editor类,然后用这个类的put方法写文件。为什么要这样做呢?好久没有看设计模式了,不知道他采用是哪种高级模式,等以后有时间,看看它的实现再做研究吧。
4)在这个实现中,读文件是放在onResume()中,写文件是在onPause()中,为什么要这么做呢,看字面意思,好像只有恢复和暂停的时候才会被执行,那程序第一次创建的时候会读文件吗?来让我们看看Activity的生命周期,就会发现这么做的巧妙之处:
看到了吧,在Activity运行的前后,无论状态怎么转移,onResume()和onPause()一定会被执行,与其说实现的巧妙,还不如赞一下这个生命周期的设计的巧妙,这个巧妙不是说说而已,有时间的话,看看MFC中一个windows或者dialog的生命周期,你就知道这个巧妙的含义了,我们可以省多少的事情啊!所以值得记住的是,在android中想在运行前后必须要执行的语句,就应该放在onResume()和onPause()中。
4)最后说一个对android小不爽的地方:drawable,什么鬼东西啊!在res/drawable放一个文件,访问的时候是drawable/name,如果在values里面建立一个drawable的变量,访问的时候也是drawable/name,例如在drawable目录下放入一个red.xml文件,访问的时候是@drawable/red,如果建立一个drawable的变量red,访问也是@drawable/red,这完全就是两个东西啊,虽然最新的编辑器会提示重名,但查找的时候真的很不方便啊,尤其是drawable变量,可以放在一个abc.xml中 。
这个实验描述了Activity之间的另外一种切换方式,通常Activity的切换方式是Activity1通过startActivity切换到Activity2, Activity2再通过startActivity切换到其他的Activity,但是有的时候我们需要启动一个新的Activity获取用户的输入,然后返回到原来的Activity,比如activity是一个通讯录列表,我们通过一个增加按钮打开另一个activity让用户输入新的联系人,输入后再返回通讯录列表。
这个时候,我们可以通过startActivityForResult(Intent, int)方法启动新的Activity,新的Activity通过setResult(int, Intent)方法返回老的Activity,这个时候会触发老的Activity的onActivityResult(int, int, Intent)方法,我们可以在这个方法的实现中处理返回事件。
startActivityForResult(Intent, int),其中int为Request Code,也是onActivityResult的第一个参数,通常一个Activity不仅仅只触发一个获取事件,比如上面提到的通讯录,可能会有一个增加联系人的事件,也可能会有一个修改联系人或给指定联系人增加一个电话的事件,但我们只有一个onActivityResult方法,所以我们需要这么一个Request Code区分是哪个事件的返回,这个值是用户自己定义的,而且完全是用户自己进行管理,很人性化。
setResult(int, Intent),其中的int是Result Code,它表示的是返回的状态,也是onActivityResult的第二个参数。这个参数需要特别注意一下,android为这个值提供了三个默认的常量。我们先看前两个,RESULT_CANCELED和RESULT_OK,这个从字面上很好理解,一个是运行取消,另一个是运行成功返回,当用户按BACK键时,Result Code就是RESULT_CANCELED。但我们看看他们分别对应的值,就会发现奇怪的地方,RESULT_CANCELED=0,RESULT_OK=-1!!!在其他系统中OK通常都是1,而在android,它是-1,这是为什么呢,来让我们看看第三个默认的常量,RESULT_FIRST_USER=1,明白了吧!android把所有大于0的数字都留给了用户自己,多么人性化啊!但是要注意了,如我前面所说,大部分系统都喜欢将大于0作为正确返回,小于0作为错误返回,所以很多人(包括我),喜欢用if(result > 0)表示返回成功,这个在android是不通行的,一定要特别注意!
此外在这个程序中,我们可以看到另外一件事情,关于TextView,如果我们要改变里面的内容,比如增加新的字段,需要将其设为可变长的,方法是mTextView.setText(mTextView.getText(), TextView.BufferType.EDITABLE);
修改内容的方法是通过TextView.getText()获取Editable对象,然后Editable对象进行编辑就可以了,Editable类似于StringBuffer,编辑之后会直接反映到TextView里面,不需要再setText();
2. SaveRestoreState
完全没有看懂这个Demo要演示什么效果,好像是onSaveInstanceState以及TextView的android:freezesText属性有关,但具体效果没有研究出来,留到以后再研究吧
3.Translucent
Android为透明效果提供了内置的Theme: android:style/Theme.Translucent,只需要把当前的activity的theme设置为这个Theme就可以达到完全透明的效果。
如果要半透明的话,可以增加一个继承该Theme的style即可,实现如下:
#e0000000
此外API Demo中提供了另一个实例,不用继承内置的Theme,可以自己完全创建一个新的style,实现透明效果,同时可以加一些其他特效,比如模糊化等,
⑵ android通讯录源码中如何去掉进入时的图片
首先你要看看这张图片是直接作为背景或者其他图片在布局中引用,还是在代码中动态添加,然后看看是什么操作,如果在布局中引用,可以删掉,或者替换掉,动态添加的话,把那句话注释掉看看。
⑶ 跪求大神给份用Android做的手机通讯录的完整源码,能够打电话,发短信,创建等等,谢谢了。
Android通讯录管理(获取联系人、通话记录、短信消息)
http://blog.csdn.net/wwj_748/article/details/19965913
用这个地址
⑷ Android 联系人数据库介绍以及对联系人的基本操作
您好,很高兴为您解答。
一、 联系人数据库
联系人的数据库文件的位置
/data/data/com.android.providers.contacts/databases.contacts2.db
数据库中重要的几张表
1、contacts表
该表保存了所有的手机测联系人,每个联系人占一行,该表保存了联系人的
ContactID、联系次数、最后一次联系的时间、是否含有号码、是否被添加
到收藏夹等信息。
2、raw_contacts表
该表保存了所有创建过的手机测联系人,每个联系人占一行,表里有一列标
识该联系人是否被删除,该表保存了两个ID:RawContactID和ContactID,
从而将contacts表和raw_contacts表联系起来。该表保存了联系人的
RawContactID、ContactID、联系次数、最后一次联系的时间、是否被添
加到收藏夹、显示的名字、用于排序的汉语拼音等信息。
3、 mimetypes
该表定义了所有的MimeTypeID,即联系人的各个字段的唯一标志。
4、data表
该表保存了所有创建过的手机测联系人的所有信息,每个字段占一行 ,该表
保存了两个ID:MimeTypeID和RawContactID,从而将data表和
raw_contacts表联系起来。
联系人的所有信息保存在列data1至data15中,各列中保存的内容根据
MimeTypeID的不同而不同。如保存号码(MimeTypeID=5)的那行数据中,
data1列保存号码,data2列保存号码类型(手机号码/家庭号码/工作号码等)。
二、对联系人的基本操作
这里的基本操作只是针对手机测的联系人,(U)SIM侧的联系人的操
作后续介绍。
如果对联系人的基本操作,我们必须得到许可。
方法就是在AndroidManifest.xml文件中配置如下权限:
<uses-permissionandroid:name="android.permission.READ_CONTACTS"
/>
<uses-permissionandroid:name="android.permission.WRITE_CONTACTS"
/>
读取联系人
分为以下步骤:
1、先读取contacts表,获取ContactsID;
2、再在raw_contacts表中根据ContactsID获取RawContactsID;
3、然后就可以在data表中根据RawContactsID获取该联系人的各数据了。
//获取用来操作数据的类的对象,对联系人的基本操作都是使用这个对象
ContentResolvercr=getContentResolver();
//查询contacts表的所有记录
Cursorcur=cr.query(ContactsContract.Contacts.CONTENT_URI,null,null,
null,null);
//如果记录不为空
if(cur.getCount()>0)
{
//游标初始指向查询结果的第一条记录的上方,执行moveToNext函数会判断
//下一条记录是否存在,如果存在,指向下一条记录。否则,返回false。
while(cur.moveToNext())
{
StringrawContactsId="";
Stringid=
cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
str+="ID:"+id+" ";二、对联系人的基本操作(4)
//读取rawContactsId
CursorrawContactsIdCur=cr.query(RawContacts.CONTENT_URI,
null,
RawContacts.CONTACT_ID+"=?",
newString[]{id},null);
//该查询结果一般只返回一条记录,所以我们直接让游标指向第一条记录
if(rawContactsIdCur.moveToFirst())
{
//读取第一条记录的RawContacts._ID列的值
rawContactsId=
rawContactsIdCur.getString(rawContactsIdCur.getColumnIndex(
RawContacts._ID));
}
rawContactsIdCur.close();
//读取号码
If(Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.
Contacts.HAS_PHONE_NUMBER)))>0)
{
//根据查询RAW_CONTACT_ID查询该联系人的号码
CursorPhoneCur=
cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.RAW_CONTACT_ID+"=
?",
newString[]{rawContactsId},null);
//上面的ContactsContract.CommonDataKinds.Phone.CONTENT_URI
//可以用下面的phoneUri代替
//UriphoneUri=Uri.parse("content://com.android.contacts/data/phones");二、对联系人的基本操作(6)
//一个联系人可能有多个号码,需要遍历
while(PhoneCur.moveToNext())
{
//号获取码
Stringnumber=
PhoneCur.getString(PhoneCur.getColumnIndex(
ContactsContract.CommonDataKinds.Phone.NUMBER));
//获取号码类型
StringnumberType=
PhoneCur.getString(PhoneCur.getColumnIndex(
ContactsContract.CommonDataKinds.Phone.TYPE));
}
PhoneCur.close();
新建联系人
新建联系人时, 根据contacts、raw_ contacts两张表中ID的使用情况,自动
生成ContactID和RawContactID。
Android源码新建重复姓名的联系人的ContactID是不重复的,所以会重复显
示。
用下面的代码新建联系人,如果多次新建的联系人的姓名是一样的,生成的
ContactID也会重复,RawContactID不会重复,我们在读取联系人的时候可
以获取所有同姓名联系人的号码等信息,在显示联系人的时候,重复姓名的
联系人的所有字段信息都会合并起来显示为一个联系人。
ContentValuesvalues=newContentValues();
UrirawContactUri=
getContentResolver().insert(RawContacts.CONTENT_URI,values);
longrawContactId=ContentUris.parseId(rawContactUri);二、对联系人的基本操作(8)
//向data表插入姓名数据
if(name!="")
{
values.clear();
values.put(Data.RAW_CONTACT_ID,rawContactId);
values.put(Data.MIMETYPE,
StructuredName.CONTENT_ITEM_TYPE);
values.put(StructuredName.GIVEN_NAME,name);
getContentResolver().insert(ContactsContract.Data.CONTENT_URI,
values);
}
//向data表插入电话数据
if(phoneNum!="")
{
values.clear();
values.put(Data.RAW_CONTACT_ID,rawContactId);
values.put(Data.MIMETYPE,Phone.CONTENT_ITEM_TYPE);
values.put(Phone.NUMBER,phoneNum);
values.put(Phone.TYPE,Phone.TYPE_MOBILE);
getContentResolver().insert(ContactsContract.Data.CONTENT_URI,
values);
}
删除联系人
我们只需要将raw_contacts表中指定RawContactID的
行删除,其他表中与之关联的数据都会自动删除。
publicvoiddelete(longrawContactId)
{
getContentResolver().delete(ContentUris.withAppendedId(RawContac
ts.CONTENT_URI,rawContactId),null,null);
}
更新联系人
联系人的所有信息都是保存在data表中,所以要更新联系人,我们只需要根
据RawContactID和MIMETYPE修改data表中的内容。
ContentValuesvalues=newContentValues();
values.put(Phone.NUMBER,“123");
values.put(Phone.TYPE,Phone.TYPE_MOBILE);
StringWhere=ContactsContract.Data.RAW_CONTACT_ID+"=?AND
"+ContactsContract.Data.MIMETYPE+"=?";
String[]WhereParams=newString[]{"5",Phone.CONTENT_ITEM_TYPE};
getContentResolver().update(ContactsContract.Data.CONTENT_URI,
values,Where,WhereParams);
如若满意,请点击右侧【采纳答案】,如若还有问题,请点击【追问】
希望我的回答对您有所帮助,望采纳!
~O(∩_∩)O~
⑸ android 通讯录 怎么改联系人
通过getContentResolver()得到ContentResolver
后,我们就可以通过该对象的delete,insert,updata,query等方法间接操作联系人数据库,那么,如果我们删除某些联系人,以ContactsContract.RawContacts.CONTENT_URI为例,怎么做,先来看下源码:
首先,ContentResolver调用delete();删除操作从红色部分开始
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
waitForAccess();
return super.delete(uri, selection, selectionArgs);
}
上面的super.delete(uri, selection, selectionArgs)调用父亲方法
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
int count = 0;
boolean applyingBatch = applyingBatch();
if (!applyingBatch) {
mDb = mOpenHelper.getWritableDatabase();
mDb.beginTransactionWithListener(this);
try {
count = deleteInTransaction(uri, selection, selectionArgs);
if (count > 0) {
mNotifyChange = true;
}
mDb.setTransactionSuccessful();
} finally {
mDb.endTransaction();
}
onEndTransaction();
} else {
count = deleteInTransaction(uri, selection, selectionArgs);
if (count > 0) {
mNotifyChange = true;
}
}
return count;
}
父类回调deleteInTransaction(uri, selection, selectionArgs);删除联系人操作在这里进行。
//该方法对uri进行匹配来执行相应的删除操作,并且是在事务中完成的,,比如
//content://com.android.contacts/contacts
//content://com.android.contacts/contacts/#
// .......................................................省略
@Override
protected int deleteInTransaction(Uri uri, String selection, String[] selectionArgs) {
.......................................................
.......................................................
//我们可以在uri中的authority部分可带可选的参数ContactsContract.CALLER_IS_SYNCADAPTER
//比如uri字符串可以写成content://com.android.contacts?ContactsContract.CALLER_IS_SYNCADAPTER=true
// ContactsContract.CALLER_IS_SYNCADAPTER默认是false的,他告诉同步适配器如何执行删除操作。
//如果设置为true,则delete的时候直接删除联系人,否则,默认delete时是不会立即删除RawContacts中的数据的,
//只是把RawContacts.DELETED标志位设置为1,从它的aggregate contact中移除该raw contact,即显示联系人时不显示它的内容
//同步联系人时,删除服务器上的raw contact,最终删除手机上已
//标记为DELETED为1的raw contacts
final boolean callerIsSyncAdapter = readBooleanQueryParameter(uri, ContactsContract.CALLER_IS_SYNCADAPTER, false);
final int match = sUriMatcher.match(uri);
switch (match) {
.......................................................
.......................................................
.......................................................
case CONTACTS: {//uri为content://com.android.contacts/contacts,目录(dir)类型
// TODO
return 0;
}
case CONTACTS_ID: {//删除某一个联系人,uri指定了ContactsContract.Contacts中的字段contact_id,Item类型
long contactId = ContentUris.parseId(uri);//得到该给定联系人数据集的id
return deleteContact(contactId);
}
.......................................................
.......................................................
.......................................................
case RAW_CONTACTS: {
int numDeletes = 0;
Cursor c = mDb.query(Tables.RAW_CONTACTS, new String[]{RawContacts._ID},
appendAccountToSelection(uri, selection), selectionArgs, null, null, null);
try {
while (c.moveToNext()) {
final long rawContactId = c.getLong(0);
numDeletes += deleteRawContact(rawContactId, callerIsSyncAdapter);
}
} finally {
c.close();
}
return numDeletes;
}
case RAW_CONTACTS_ID: {
final long rawContactId = ContentUris.parseId(uri);
return deleteRawContact(rawContactId, callerIsSyncAdapter);
}
case DATA: {
mSyncToNetwork |= !callerIsSyncAdapter;
return deleteData(appendAccountToSelection(uri, selection), selectionArgs,
callerIsSyncAdapter);
}
case DATA_ID:
case PHONES_ID:
case EMAILS_ID:
case POSTALS_ID: {
long dataId = ContentUris.parseId(uri);
mSyncToNetwork |= !callerIsSyncAdapter;
return deleteData(Data._ID + "=" + dataId, null, callerIsSyncAdapter);
}
.......................................................
.......................................................
.......................................................
}
}
public int deleteRawContact(long rawContactId, boolean callerIsSyncAdapter) {
if (callerIsSyncAdapter) {
mDb.delete(Tables.PRESENCE, PresenceColumns.RAW_CONTACT_ID + "=" + rawContactId, null);
//直接删除数据
return mDb.delete(Tables.RAW_CONTACTS, RawContacts._ID + "=" + rawContactId, null);
} else {
//从他关联的aggregate contact移除该数据
mDbHelper.removeContactIfSingleton(rawContactId);
//标记为已删除,但不是立即删除数据
return markRawContactAsDeleted(rawContactId);
}
}
综上,我们要删除联系人可以这样做:
1)删除单个联系人:
CR.delete(ContactsContract.RawContacts.CONTENT_URI,ContactsContract.RawContacts_id + "=" + delRawId);
2)删除全部联系人:
getContentResolver().delete(Uri.parse(ContactsContract.RawContacts.CONTENT_URI.toString() +"?" + ContactsContract.CALLER_IS_SYNCADAPTER+"=true"), ContactsContract.RawContacts._ID + ">0", null));
数据索引从1开始,所以只要id>0就可以全部删除raw contact记录,上面的删除操作是立即进行的,因为我们设置了true.
⑹ IM即时通讯聊天社交APP源码,交友APP源码
交友APP源码 IM带音视频源码Uniapp 即时通讯安卓苹果APP源码
前端开发语言:VUE( 安卓,IOS,WEB为一套前端代码)
服务器端开发语言: PHP+WebSocket
数据库:MySql + mongodb
前端打包工具:Hbuilder
服务器搭建工具:宝塔 + Xshell
短信接口: 支持阿里云
支付接口:支持支付宝
服务器配置: 4核8G宽带10兆以上
服务器系统:Linux Centos 7.6 64位
基本功能说明:
1.发消息:语音、图片、视频、文字、表情、表情包、文件、名片等。
2.聊天:单聊、群聊。
3.自定义消息:发红包、转账。
4.聊天记录:清空聊天记录、群管理、加群二维码控制是否可加。
5.自定义添加链接。
6.我的钱包:后台可以充值、用户充值、提现等。
7.创建群:可任意创建群,群成员数量不受限制,好友数量不受限。
8.群功能:设置群二维码、群公告、群共享文件、顶置聊天、消息免打扰,屏蔽群信息、禁言、举报、群管理、查找聊天记录、禁止全员相互加好友、清空聊天记录等。
9.好友聊天:文字、语音、音视频通话、收藏、照片、小视频、各种表情、传送文件、发送位置、引用回复、撤回、复制、删除、收藏、撤回、录制、多选、发红包,转账等。
10.生活圈动态:可以发送图文、语音、视频、可点赞,评论、举报等。
11.会员登录:注册登录、短信登录。
12.账号设置:修改密码、语言切换、字体设置、隐私设置、安全设置、一键群发好友消息等。
13.用户管理:登录时间、登陆IP、更换头像、更换名称、设置密码、批量生成用户。
14.后台功能: 管理员列表、系统设置、用户管理、群组管理、通讯录管理、财务管理、会话管理、自定义网站、手机通讯录
了解更多源码内容,您可以私信我!
如果您也喜欢这篇文章,记得点赞+关注+评论+转发哟![比心][比心][比心]
⑺ 关于ANDROID自带的联系人CONTACTS源码的分析,求助
The Structure of the Contacts Mole
|——/packages/apps/Contacts/src/com/android/contacts
| |——ContactsListActivity.java
| |——ContactsManagementActivity.java
| |——DialtactsActivity.java
| |——ExportVCardActivity.java
| |——GroupsManagementActivity.java
| |——ImportVCardActivity.java
| |——ViewContactActivity.java
| |
| |——model
| | |——ContactsSource.java
| | |——EntityDelta.java
| | |——FallbackSource.java
| | |——Sources.java
| |
| |——ui
| | |——EditContactActiviry.java
| |
| |——widget
| | |——BaseContactEditorView.java
| | |——ContactEditorView.java
| | |——GenericEditorView.java
| | |——KindSectionView.java
| | |——PhotoEditorView.java
| | |——ReadOnlyContactEditorView.java
| |
| |——util
| |——Constants.java
| |——EmptyService.java
|
|——/packages/apps/Contacts/res
| |——drawable
| |——drawable-finger
| |——drawable-hdpi
| |——drawable-hdpi-finger
| |——drawable-mdpi
| |——drawable-mdpi-finger
| |——layout
| |——menu
| |——values
| |——values-zh-rCN
| |——AndroidManifest.xml
|
|——/packages/providers/ContactsProviders/src/com/android/providers/contacts
| |——ContactsDatabaseHelper.java
| |——ContactsProvider.java
| |——ContactsProvider2.java
| |——SQLiteContentProvider.java
|
|——The database address and name
|——data/data/com.android.providers.contacts/databases/contacts2.db
⑻ Android快速获取联系人
获取联系人在Android开发中经常会遇到,最近项目需要用到获取手机联系人的功能,于是写了一个先查询联系人id然后再根据id查询手机号demo,结果慢到怀疑人生(亲测联系人数据1500+)。最后经过优化查询方式后,查询时间在200ms左右(亲测联系人数据1500+)在这里分享给大家,以方便自己好直接拿来用。国际惯例,注:以下测试只查询名字和手机号码
1、查询所有联系人
2、通过姓名获取联系人
3、通过手机号码查询联系人
最后附上源码:
联系人保存位置及文件名:/data/data/com.providers.contacts/databases/contacts2.db
⑽ 为什么我在eclipse导入Android自带通讯录源码有那么多错误,好像是缺少几个包,求解
没装ANDROID SDK吧。。。
http://apps.hi..com/share/detail/34638353下面有完整教材和下载,希望采纳