Android程式設計權威指南(第2版)—第15章挑戰練習
15.5 挑戰練習:ShareCompat
mReportButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
/*Intent i = new Intent(Intent.ACTION_SEND);
i.setType("text/plain");
i.putExtra(Intent.EXTRA_TEXT, getCrimeReport());
i.putExtra(Intent.EXTRA_SUBJECT,
getString(R.string.crime_report_subject));
i = Intent.createChooser(i, getString(R.string.send_report));
startActivity(i);*/
ShareCompat.IntentBuilder i = ShareCompat.IntentBuilder.from(getActivity());
i.setType("text/plain");
i.setText(getCrimeReport());
i.setSubject(getString(R.string.send_report));
i.startChooser();
}
});
參照:點選開啟連結
15.6 挑戰練習:又一個隱式intent
增加一個call按鈕,修改fragment_crime.xml
<Button
android:id="@+id/crime_call_suspect"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/crime_call_suspect_text"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"/>
修改strings.xml,增加
<string name="crime_call_suspect_text">Call Suspect</string>
修改AndroidManifest.xml增加android.permission.READ_CONTACTS許可權
</application>
<uses-permission android:name="android.permission.READ_CONTACTS"/>
</manifest>
增加資料庫表及Crime欄位SuspectContact
Crime.java
private String mSuspectContact;
public String getSuspectContact() {
return mSuspectContact;
}
public void setSuspectContact(String suspectContact) {
mSuspectContact = suspectContact;
}
CrimeLab.java
private static ContentValues getContentValues (Crime crime) {
ContentValues values = new ContentValues();
values.put(CrimeTable.Cols.UUID, crime.getId().toString());
values.put(CrimeTable.Cols.TITLE, crime.getTitle());
values.put(CrimeTable.Cols.DATE, crime.getDate().getTime());
values.put(CrimeTable.Cols.HOUR, crime.getHour());
values.put(CrimeTable.Cols.MINUTE, crime.getMinute());
values.put(CrimeTable.Cols.SOLVED, crime.isSolved() ? 1 : 0);
values.put(CrimeTable.Cols.SUSPECT, crime.getSuspect());
values.put(CrimeTable.Cols.SuspectContact, crime.getSuspectContact());//add this one
return values;
}
public static final class CrimeTable {
public static final String NAME = "crimes";
public static final class Cols {
public static final String UUID = "uuid";
public static final String TITLE = "title";
public static final String DATE = "date";
public static final String HOUR = "hour";
public static final String MINUTE = "minute";
public static final String SOLVED = "solved";
public static final String SUSPECT = "suspect";
public static final String SuspectContact = "suspectcontact"; //add this one
}
}
CrimeBaseHelper.java
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table " + CrimeTable.NAME + "(" +
" _id integer primary key autoincrement, " +
CrimeTable.Cols.UUID + ", " +
CrimeTable.Cols.TITLE + ", " +
CrimeTable.Cols.DATE + ", " +
CrimeTable.Cols.HOUR + ", " +
CrimeTable.Cols.MINUTE + ", " +
CrimeTable.Cols.SOLVED + ", " +
CrimeTable.Cols.SUSPECT + ", " +
CrimeTable.Cols.SuspectContact + //add this one
")"
);
}
CrimeCursorWrapper.java
public Crime getCrime() {
String uuidString = getString(getColumnIndex(CrimeTable.Cols.UUID));
String title = getString(getColumnIndex(CrimeTable.Cols.TITLE));
long date = getLong(getColumnIndex(CrimeTable.Cols.DATE));
int hour = getInt(getColumnIndex(CrimeTable.Cols.HOUR));
int minute = getInt(getColumnIndex(CrimeTable.Cols.MINUTE));
int isSolved = getInt(getColumnIndex(CrimeTable.Cols.SOLVED));
String suspect = getString(getColumnIndex(CrimeTable.Cols.SUSPECT));
String suspectcontact = getString(getColumnIndex(CrimeTable.Cols.SuspectContact)); //add this one
Crime crime = new Crime(UUID.fromString(uuidString));
crime.setTitle(title);
crime.setDate(new Date(date));
crime.setHour(hour);
crime.setMinute(minute);
crime.setSolved(isSolved != 0);
crime.setSuspect(suspect);
crime.setSuspectContact(suspectcontact);//add this one
return crime;
}
CrimeFragment.java
onCreateView
// Call Suspect function
mCallSuspectButton = (Button) v.findViewById(R.id.crime_call_suspect);
if (mCrime.getSuspectContact() == null) {
mCallSuspectButton.setEnabled(false);
} else {
mCallSuspectButton.setEnabled(true);
mCallSuspectButton.setText(mCrime.getSuspectContact());
}
mCallSuspectButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//startActivity(callContact);
Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:" + mCrime.getSuspectContact()));
startActivity(intent);
}
});
onActivityResult
else if (requestCode == REQUEST_CONTACT && data != null) {
Uri contactUri = data.getData();
// Specify which fields you want your query to return values for
String[] queryFields = new String[] {
ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.Contacts._ID
};
// Perform your query - the contactUri is like a "where" clause here
Cursor c = getActivity().getContentResolver()
.query(contactUri, queryFields, null, null, null);
String SuspectContactId = null;
try {
// Double-check that you actually got results
if (c.getCount() == 0) {
return;
}
// Pull out the first column of the first row of data that is your suspect's name
c.moveToFirst();
String suspect = c.getString(0);
mCrime.setSuspect(suspect);
mSuspectButton.setText(suspect);
String _id = c.getString(1);
//mCrime.setSuspectContactId(_id);
SuspectContactId = _id;
} finally {
c.close();
}
Cursor cursor = getActivity().getContentResolver()
.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?",
new String[] {SuspectContactId},
null);
try {
if (cursor.getCount() == 0) {
return;
}
cursor.moveToFirst();
int index = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
String number = cursor.getString(index);
mCrime.setSuspectContact(number);
mCallSuspectButton.setEnabled(true);
mCallSuspectButton.setText(number);
} finally {
cursor.close();
}
}
效果圖:
相關文章
- Android程式設計權威指南(第2版)—第14章挑戰練習Android程式設計
- Android程式設計權威指南(第2版)—第12章挑戰練習Android程式設計
- Android程式設計權威指南(第二版)— 第10章挑戰練習Android程式設計
- Android程式設計權威指南(第二版)— 第13章挑戰練習-13.6Android程式設計
- Android程式設計權威指南(第二版)— 第13章挑戰練習-13.8Android程式設計
- Android程式設計權威指南 - 第10章 使用fragment argumentAndroid程式設計Fragment
- Android程式設計權威指南(第二版)學習筆記(十五)—— 第15章 隱式 IntentAndroid程式設計筆記Intent
- Android程式設計權威指南(第二版)學習筆記(十六)—— 第16章 使用 intent 拍照Android程式設計筆記Intent
- HTTP權威指南學習-第12章 基本認證機制HTTP
- Hadoop權威指南 第4章 關於YARNHadoopYarn
- Swift程式設計權威指南第2版 讀後收穫Swift程式設計
- 《Android程式設計權威指南 第3版》PDF版電子書下載Android程式設計
- 《父與子的程式設計之旅(第3版)》第15章習題答案程式設計
- C Primer Plus 第9章 函式 程式設計練習函式程式設計
- 《HTML52D遊戲程式設計核心技術》——第3章,第3.11節練習HTML遊戲程式設計
- HTTP權威指南學習--第8章 整合點:閘道器、隧道及中繼HTTP中繼
- 小記《SQL權威指南(第4版)》SQL
- 《Java語言程式設計(基礎篇)(原書第10版)》第2~4章部分程式設計練習題程式碼Java程式設計
- CUDA C 程式設計權威指南 學習筆記:第二章 CUDA程式設計模型程式設計筆記模型
- 《HTML5與CSS3權威指南(第3版·下冊)》——第19章選 擇 器HTMLCSSS3
- 筆記:《挑戰程式設計競賽(第2版)》(2)筆記程式設計
- 筆記:《挑戰程式設計競賽(第2版)》(3)筆記程式設計
- 筆記:《挑戰程式設計競賽(第2版)》(1)筆記程式設計
- Android程式設計基礎 • 【第1章 Android程式入門】Android程式設計
- 《HTML5與CSS3權威指南(第3版·下冊)》——第18章CSS3概述HTMLCSSS3
- JavaScript物件程式設計-第3章JavaScript物件程式設計
- 第12章、網路程式設計程式設計
- 第1章 程式設計的方法程式設計
- 安卓權威指南第三版第16章拍照閃退問題安卓
- 《父與子的程式設計之旅(第3版)》第1章習題答案程式設計
- 《父與子的程式設計之旅(第3版)》第2章習題答案程式設計
- 《父與子的程式設計之旅(第3版)》第3章習題答案程式設計
- 《父與子的程式設計之旅(第3版)》第4章習題答案程式設計
- 《父與子的程式設計之旅(第3版)》第5章習題答案程式設計
- 《父與子的程式設計之旅(第3版)》第6章習題答案程式設計
- 《父與子的程式設計之旅(第3版)》第7章習題答案程式設計
- 《父與子的程式設計之旅(第3版)》第8章習題答案程式設計
- 《父與子的程式設計之旅(第3版)》第9章習題答案程式設計