Академический Документы
Профессиональный Документы
Культура Документы
18
switch (uriMatcher.match(uri)) {
case FRIENDS:
queryBuilder.setProjectionMap(BirthMap);
break;
case FRIENDS_ID:
queryBuilder.appendWhere(
ID + "=" + uri.getLastPathSegment());
break;
default:
throw new IllegalArgumentException("Unknown URI "+ uri);
}
if (sortOrder == null || sortOrder == ""){ sortOrder = NAME; }
Cursor cursor = queryBuilder.query(database, projection,
selection, selectionArgs, null, null, sortOrder);
// register to watch a content URI for changes
cursor.setNotificationUri(getContext().getContentResolver(), uri);
return cursor;
}
19
@Override
public Uri insert(Uri uri, ContentValues values) {
long row = database.insert(TABLE_NAME, "", values);
if(row > 0) {
Uri newUri= ContentUris.withAppendedId(CONTENT_URI, row);
getContext().getContentResolver().notifyChange(newUri, null);
return newUri;
}
throw new SQLException("Fail to add a new record into " + uri);
}
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Name "
android:id="@+id/btnName"
27
android:onClick="loadNames"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Phone"
android:id="@+id/btnPhone"
android:onClick="loadPhones"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Email"
android:id="@+id/btnEmail"
android:onClick="loadEmails"/>
</LinearLayout>
28
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="20dp"
android:text=""
android:textSize="20sp"
android:id="@+id/contacts" />
</LinearLayout>
29
public class MainActivity extends AppCompatActivity {
private static final int PERMISSION_TO_READ = 100;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
checkForPermission();
}
30
public void checkForPermission() {
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.READ_CONTACTS)
!= PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.READ_CONTACTS)) {
// Show explanation to user *asynchronously* -- don't block
// this thread waiting for the user's response! After the user
// sees the explanation, try again to request the permission.
} else {
// No explanation needed, we can request the permission.
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.READ_CONTACTS},
PERMISSION_TO_READ);
}
} 31
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case PERMISSION_TO_READ: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0 && grantResults[0] ==
PackageManager.PERMISSION_GRANTED) {
// permission was granted.
} else {
// permission denied. Disable the
// functionality that depends on this permission.
}
return;
}
// other 'case' lines to check for other permissions
}
32
}
public void loadNames (View v) {
TextView cv = (TextView) findViewById(R.id.contacts);
cv.setText("");
String sortOrder =
ContactsContract.Contacts.DISPLAY_NAME
+ " COLLATE LOCALIZED ASC";
33
ContentResolver cr = getContentResolver();
Cursor cursor = cr.query(uri, projection, selection,
selectionArgs, sortOrder);
while (cursor.moveToNext()) {
String displayName = cursor.getString(
cursor .getColumnIndex(
ContactsContract.Data.DISPLAY_NAME));
cv.append("Name: "+displayName+"\n");
}
}
34
public void loadPhones(View v) {
TextView cv = (TextView) findViewById(R.id.contacts);
cv.setText("");
Uri uri = ContactsContract.CommonDataKinds
.Phone.CONTENT_URI;
String[] projection = new String[] {
ContactsContract.Contacts._ID,
ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.CommonDataKinds.Phone.NUMBER
};
// ContactsContract.CommonDataKinds.
// StructuredPostal.FORMATTED_ADDRESS,
// ContactsContract.CommonDataKinds.Photo.PHOTO};
35
String selection = ContactsContract.Contacts.
HAS_PHONE_NUMBER + " = ?";
String[] selectionArgs = new String[]{ String.valueOf(1)};
String sortOrder =
ContactsContract.Contacts.DISPLAY_NAME
+ " COLLATE LOCALIZED ASC";
Cursor cursor = getContentResolver().query(
uri, projection, selection, selectionArgs, sortOrder);
while (cursor.moveToNext()) {
String displayName = cursor.getString(
cursor.getColumnIndex(
ContactsContract.Data.DISPLAY_NAME));
String phoneNo = cursor.getString(
cursor.getColumnIndex(
ContactsContract.CommonDataKinds.Phone.NUMBER));
cv.append("Name: "+displayName+"\n");
cv.append("Phone: "+phoneNo+"\n\n\n");
}
} 36
public void loadEmails(View v){
TextView cv = (TextView) findViewById(R.id.contacts);
Uri uri = ContactsContract.
CommonDataKinds.Phone.CONTENT_URI;
Cursor cur = getContentResolver().query(
ContactsContract.Contacts.CONTENT_URI,
null, null, null, null);
String[] projection = new String[] {
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
ContactsContract.CommonDataKinds.Phone.NUMBER,
ContactsContract.CommonDataKinds.Email.DATA };
Cursor names = getContentResolver().query(
uri, projection, null, null, null);
while (cur.moveToNext()) {
cv.setText("");
String id = cur.getString(cur.getColumnIndex(
ContactsContract.Contacts._ID));
String name = cur.getString(cur.getColumnIndex(
ContactsContract.Contacts.DISPLAY_NAME));
37
Cursor email = getContentResolver().query(
ContactsContract.CommonDataKinds.Email.CONTENT_URI, null,
ContactsContract.CommonDataKinds.Email.CONTACT_ID+"= ?",
new String[]{id}, null);
cv.append("Name: "+ name +"\n");
while (email.moveToNext()) {
String emailid = email.getString(email.getColumnIndex(
ContactsContract.CommonDataKinds.Email.DATA));
String emailType = email.getString(email.getColumnIndex(
ContactsContract.CommonDataKinds.Email.TYPE));
cv.append(emailType+": "+ emailid + "\n");
}
email.close();
cv.append("\n\n\n");
} //end while
} //end loadEmails
} 38
AndroidManifest.xml
<uses-permission
android:name=
"android.permission.READ_CONTACTS">
</uses-permission>
42
class DBHelper extends SQLiteOpenHelper {
// database declarations
public DBHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVer, int newVer) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
onCreate(db);
}
}
43
public class ProviderContract {
static final String PROVIDER_NAME=
"com.bestapp.BirthdayProvider";
static final String URL =
"content://"+PROVIDER_NAME+"/friends";
static final Uri CONTENT_URI = Uri.parse(URL);
static final String ID = "id";
static final String NAME = "name";
static final String BIRTHDAY = "birthday";
}
44
public class BirthdayProvider extends ContentProvider {
static final int FRIENDS = 1;
static final int FRIENDS_ID = 2;
DBHelper dbHelper;
static final UriMatcher uriMatcher;
static{
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI(
ProviderContract.PROVIDER_NAME, "friends", FRIENDS);
uriMatcher.addURI(
ProviderContract.PROVIDER_NAME, "friends/#",
FRIENDS_ID);
}
@Override
public boolean onCreate () { }
45
@Override
public Cursor query (Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) { }
@Override
public Uri insert (Uri uri, ContentValues values) { }
@Override
public int update (Uri uri, ContentValues val, String selection,
String[] args){ }
@Override
public int delete (Uri uri, String selection, String[] selectionArgs){ }
@Override
public String getType (Uri uri) { }
}
46
@Override
public boolean onCreate() {
dbHelper = new DBHelper(getContext());
SQLiteDatabase database = dbHelper.getWritableDatabase();
if(database == null) return false;
else return true;
}
@Override
public Cursor query (Uri uri, String[] projection, String
selection, String[] selectionArgs, String sortOrder) {
SQLiteDatabase database = dbHelper.getWritableDatabase();
SQLiteQueryBuilder queryBuilder =
new SQLiteQueryBuilder();
queryBuilder.setTables(DBHelper.TABLE_NAME);
47
switch (uriMatcher.match(uri)) {
case FRIENDS:
break;
case FRIENDS_ID:
queryBuilder.appendWhere(
ProviderContract.ID + "=" + uri.getLastPathSegment());
break;
default:
throw new IllegalArgumentException("Unknown URI "+ uri);
}
if (sortOrder == null || sortOrder == "") {
sortOrder = ProviderContract.NAME;
}
Cursor cursor = queryBuilder.query(database, projection,
selection, selectionArgs, null, null, sortOrder);
cursor.setNotificationUri(getContext().getContentResolver(), uri);
return cursor;
}
48
@Override
public Uri insert (Uri uri, ContentValues values) {
SQLiteDatabase database = dbHelper.getWritableDatabase();
long row = database.insert(DBHelper.TABLE_NAME, "",
values);
if(row > 0) {
Uri newUri = ContentUris.withAppendedId(
ProviderContract.CONTENT_URI, row);
getContext().getContentResolver().notifyChange(
newUri, null);
return newUri;
}
throw new SQLException("Fail to add new record into " + uri);
}
49
@Override
public int update (Uri uri, ContentValues val,
String selection, String[] args){
SQLiteDatabase database = dbHelper.getWritableDatabase();
int count = 0;
switch (uriMatcher.match(uri)){
case FRIENDS:
count = database.update(
DBHelper.TABLE_NAME, val, selection, args);
break;
case FRIENDS_ID:
count = database.update(
DBHelper.TABLE_NAME, val, ProviderContract.ID
+ " = " + uri.getLastPathSegment()
+ (!TextUtils.isEmpty(selection) ? " AND ("
+ selection + ')' : ""), args);
break; 50
default:
throw new IllegalArgumentException(
"Unsupported URI "+ uri);
}
getContext().getContentResolver().notifyChange(uri, null);
return count;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs){
SQLiteDatabase database = dbHelper.getWritableDatabase();
int count = 0;
switch (uriMatcher.match(uri)){
case FRIENDS:
count=database.delete(
DBHelper.TABLE_NAME, selection, selectionArgs);
break;
51
case FRIENDS_ID:
String id = uri.getLastPathSegment(); //gets the id
count = database.delete (DBHelper.TABLE_NAME,
ProviderContract.ID + " = " + id
+ (!TextUtils.isEmpty(selection) ? " AND ("
+ selection + ')' : ""), selectionArgs);
break;
default:
throw new IllegalArgumentException(
"Unsupported URI "+uri);
}
getContext().getContentResolver().notifyChange(uri, null);
return count;
}
52
@Override
public String getType (Uri uri) {
switch (uriMatcher.match(uri)){
// Get all friend-birthday records
case FRIENDS:
return "vnd.android.cursor.dir/vnd.example.friends";
// Get a particular friend
case FRIENDS_ID:
return "vnd.android.cursor.item/vnd.example.friends";
default:
throw new IllegalArgumentException("Err URI: " +
uri);
}
} 53
Content Provider Manifest File:
<provider android:name=
"com.bestapp.birthdayproviderapp.BirthdayProvider"
android:authorities="com.bestapp.BirthdayProvider"
android:exported="true">
</provider>
54
Client
62
public class ProviderContract {
static final String PROVIDER_NAME=
"com.bestapp.BirthdayProvider";
static final String URL =
"content://"+PROVIDER_NAME+"/friends";
static final Uri CONTENT_URI = Uri.parse(URL);
static final String ID = "id";
static final String NAME = "name";
static final String BIRTHDAY = "birthday";
}
63