通訊錄安卓源碼
⑴ 怎麼查看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下面有完整教材和下載,希望採納