package com.ckcs.android;
import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.provider.ContactsContract.PhoneLookup;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class HelloAndroid extends Activity implements OnClickListener {
/** Called when the activity is first created. */
private TextView messageLabel;
private EditText messageField;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 初始化试图
Button sendButton = (Button) findViewById(R.id.sendMessageButton);
sendButton.setOnClickListener(this);
messageLabel = (TextView) findViewById(R.id.messageLabel);
messageField = (EditText) findViewById(R.id.messageField);
// 初始化联系人列表
listContacts();
}
private void listContacts() {
// 得到ContentResolver对象
ContentResolver cr = getContentResolver();
// 取得电话本中开始一项的光标
Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null,
null, null, null);
StringBuilder sb = new StringBuilder();
String singleLine = "";
while (cursor.moveToNext()) {
// 取得联系人名字
int nameFieldColumnIndex = cursor
.getColumnIndex(PhoneLookup.DISPLAY_NAME);
String name = cursor.getString(nameFieldColumnIndex);
singleLine += name + " : ";
// 取得联系人ID
String contactId = cursor.getString(cursor
.getColumnIndex(ContactsContract.Contacts._ID));
Cursor phone = cr.query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = "
+ contactId, null, null);
// 取得电话号码(可能存在多个号码)
while (phone.moveToNext()) {
String strPhoneNumber = phone
.getString(phone
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
singleLine += (strPhoneNumber + " : ");
}
phone.close();
singleLine += "/n";
sb.append(singleLine);
singleLine = "";
}
cursor.close();
TextView contactInfoLabel = (TextView) findViewById(R.id.contactInfoLabel);
contactInfoLabel.setText(sb.toString());
}
/*
* (non-Javadoc)
*
* @see android.view.View.OnClickListeneronClick(android.view.View)
*/
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.sendMessageButton:
doSaveMessage();
break;
default:
break;
}
}
//
private void doSaveMessage() {
messageLabel.setText(messageField.getText());
}
}
//-------------------------------------------------------------------------------------------------
package com.ckcs.android.provider;
import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import android.text.TextUtils;
import android.util.Log;
/**
* @author ckcs
*
*/
public class BooksProvider extends ContentProvider {
public static final String TAG = "BooksProvider";
public static final String PROVIDER_NAME = "com.ckcs.android.provider.BooksProvider";
public static final Uri CONTENT_URI = Uri.parse("content://"
+ PROVIDER_NAME + "/books");
public static final String _ID = "_id";
public static final String TITLE = "title";
public static final String ISBN = "isbn";
private static final int BOOKS = 1;
private static final int BOOK_ID = 2;
private static final UriMatcher uriMatcher;
static {
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI(PROVIDER_NAME, "books", BOOKS);
uriMatcher.addURI(PROVIDER_NAME, "books/", BOOK_ID);
}
// ---for database use---
private SQLiteDatabase booksDB;
private static final String DATABASE_NAME = "Books";
private static final String DATABASE_TABLE = "titles";
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_CREATE = "create table "
+ DATABASE_TABLE + " (_id integer primary key autoincrement, "
+ "title text not null, isbn text not null);";
@Override
public boolean onCreate() {
Context context = getContext();
DatabaseHelper dbHelper = new DatabaseHelper(context);
booksDB = dbHelper.getWritableDatabase();
return (booksDB == null) ? false : true;
}
private static class DatabaseHelper extends SQLiteOpenHelper {
DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(DATABASE_CREATE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.w("Content provider database",
"Upgrading database from version " + oldVersion + " to "
+ newVersion + ", which will destroy all old data");
db.execSQL("DROP TABLE IF EXISTS titles");
onCreate(db);
}
}
@Override
public String getType(Uri uri) {
switch (uriMatcher.match(uri)) {
// ---get all books---
case BOOKS:
return "vnd.android.cursor.dir/vnd.learn2develop.books ";
// ---get a particular book---
case BOOK_ID:
return "vnd.android.cursor.item/vnd.learn2develop.books ";
default:
throw new IllegalArgumentException("Unsupported URI: " + uri);
}
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
SQLiteQueryBuilder sqlBuilder = new SQLiteQueryBuilder();
sqlBuilder.setTables(DATABASE_TABLE);
if (uriMatcher.match(uri) == BOOK_ID)
// ---if getting a particular book---
sqlBuilder.appendWhere(_ID + " = " + uri.getPathSegments().get(1));
if (sortOrder == null || sortOrder == "")
sortOrder = TITLE;
Cursor c = sqlBuilder.query(booksDB, projection, selection,
selectionArgs, null, null, sortOrder);
// ---register to watch a content URI for changes---
c.setNotificationUri(getContext().getContentResolver(), uri);
return c;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
// ---add a new book---
long rowID = booksDB.insert(DATABASE_TABLE, "", values);
// ---if added successfully---
if (rowID > 0) {
Uri _uri = ContentUris.withAppendedId(CONTENT_URI, rowID);
getContext().getContentResolver().notifyChange(_uri, null);
return _uri;
}
throw new SQLException("Failed to insert row into " + uri);
}
@Override
public int delete(Uri arg0, String arg1, String[] arg2) {
// arg0 = uri
// arg1 = selection
// arg2 = selectionArgs
int count = 0;
switch (uriMatcher.match(arg0)) {
case BOOKS:
count = booksDB.delete(DATABASE_TABLE, arg1, arg2);
break;
case BOOK_ID:
String id = arg0.getPathSegments().get(1);
count = booksDB.delete(DATABASE_TABLE, _ID + " = " + id
+ (!TextUtils.isEmpty(arg1) ? " AND (" + arg1 + ')' : ""),
arg2);
break;
default:
throw new IllegalArgumentException("Unknown URI " + arg0);
}
getContext().getContentResolver().notifyChange(arg0, null);
return count;
}
@Override
public int update(Uri uri, ContentValues values,
String selection, String[] selectionArgs)
{
int count = 0;
switch (uriMatcher.match(uri)) {
case BOOKS:
count = booksDB.update(
DATABASE_TABLE,
values,
selection,
selectionArgs);
break;
case BOOK_ID:
count = booksDB.update(DATABASE_TABLE, values, _ID
+ " = "
+ uri.getPathSegments().get(1)
+ (!TextUtils.isEmpty(selection) ? " AND (" + selection
+ ')' : ""), selectionArgs);
break;
default:
throw new IllegalArgumentException("Unknown URI " + uri);
}
getContext().getContentResolver().notifyChange(uri, null);
return count;
}
}
//-------------------------------------------------------------------------------------------------------------------
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<EditText android:id="@+id/messageField" android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<TextView android:id="@+id/messageLabel" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="@string/hello" />
<Button android:id="@+id/sendMessageButton"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:text="@string/send_message" />
<TextView android:id="@+id/contactInfoLabel"
android:layout_width="fill_parent" android:layout_height="wrap_content" />
</LinearLayout>
//-------------------------------------------------------------------------------------------------------------------
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">s..............</string>
<string name="app_name">HelloAndroid</string>
<string name="send_message">Send</string>
</resources>
//-------------------------------------------------------------------------------------------------------------------
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.ckcs.android" android:versionCode="1" android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".HelloAndroid" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<provider android:name=".provider.BooksProvider"
android:authorities="com.ckcs.android.provider.BooksProvider"></provider>
</application>
<uses-permission android:name="android.permission.READ_CONTACTS">
</uses-permission>
<uses-sdk android:minSdkVersion="8" />
</manifest>