在Android中,如果要将一个程序的数据共享给另一个程序,在之前的Android版本,我们可以设置Android文件和SharedPreferences操作的两个模式:MODE_WORLD_READABLE 和 MODE_WORLD_WRITEABLE 这两种模式来使得数据可以被其他应用程序读写,但是这两种模式在在Android4(具体4.几也不记得了。。。)的时候就被废除了,那么现在要在不同的Android程序之间共享数据的话就只能通过ContentProvider(内容提供器)来实现了(排除你是黑客的前提下)。
下面来看一下怎么来读取其他Android程序的数据。
首先,如果要访问一个应用程序通过ContentProvider共享的数据,一定要借助ContentResolver类,我们可以通过Context类的getContentResolver()方法获取ContentResolver类的对象,
之后,我们就可以通过ContentResolver类提供的一些方法对数据进行 增加、更改、删除、查询 操作(和数据库的4个操作类似)。
和数据库操作不同的是,ContentResolver类的这些操作都不是通过数据库表名进行的,而是通过传入ContentProvider共享数据的Uri(统一资源标识符,通过它可以找到任何文件所处的位置)对象来标识和操作共享的数据
接下来来看一下ContentResolver类提供的操作数据的4个方法:
增加数据:insert(Uri url, ContentValues values)
第一个参数是要增加的数据所在数据表的Uri,第二个参数是通过
ContentValues对象储存的数据,通过键值对储存
删除数据:delete (Uri url, String where, String[]
selectionArgs)
第一个参数要删除的数据所在数据表的Uri,第二个参数是删除的条件,可以存在占位符,第三个参数是补全第二个参数的占位符
更改数据:update(Uri uri, ContentValues values,
String where,
String[] selectionArgs)
第一个参数是要更改的数据所在数据表的Uri,第二个参数是更改后的数据,第三第四个参数是更改数据的条件(和删除类似)
查询数据:query(Uri uri, String[] projection, String
selection, String[] selectionArgs,
String sortOrder)
第一个参数是要查询的数据所在数据表的Uri,第二个参数是要查询的具体列的信息,第三第四个参数是要查询的数据满足的条件,
第五个参数是查询结果的排序方式
下面通过一个小例子来理解:
通过ContentProvider来读取联系人信息并且建立自定义的ContentProvider,新建一个Android工程:
main_activity.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center_horizontal"
tools:context=".MainActivity" >
<Button
android:id="@+id/buttonShowContacts"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="显示电话簿" />
<ListView
android:id="@+id/contactsList"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
一个按钮,对应于获取联系人信息事件,一个ListView用于显示联系人的信息。
接下来是MainActivity.java:
import java.util.ArrayList;
import java.util.List;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.view.Menu;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;
public class MainActivity extends Activity {
Button button = null;
List<String> contactsList = new ArrayList<String>();
ArrayAdapter<String> adapter;
ListView contactsView = null;
ContentResolver contentResolver = null;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) findViewById(R.id.buttonShowContacts);
button.setOnClickListener(listener);
contactsView = (ListView) findViewById(R.id.contactsList);
adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, contactsList);
contactsView.setAdapter(adapter);
contentResolver = getContentResolver(); // 获取ContentResolver对象
}
private View.OnClickListener listener = new View.OnClickListener() {
@Override
public void onClick(View v) {
switch(v.getId())
{
case R.id.buttonShowContacts:
showContacts();
break;
}
}
};
private void showContacts()
{
/*
* 调用getContentResolver()方法获取ContentResolver对象,并且调用query方法,
* 传入联系人的Uri,来查询联系人信息,类似于数据库的查询方法。
*/
Cursor cursor = contentResolver.query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null, null, null, null);
if(cursor.moveToFirst())
{
contactsList.clear();
do
{
/*
* 获取联系人姓名
*/
String str = "姓名:" + cursor.getString(cursor.getColumnIndex(
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)) + "\n";
/*
* 获取联系人电话号码
*/
str += "电话:" + cursor.getString(cursor.getColumnIndex(
ContactsContract.CommonDataKinds.Phone.NUMBER));
contactsList.add(str);
}while(cursor.moveToNext());
}
cursor.close();
adapter.notifyDataSetChanged(); // 适配器发送更改后的数据
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
MainActivity.java主要做一件事:自定义一个方showContacts() 用于获取联系人信息并且显示在ListView控件中,这个方法中
首先调用了ContentResolver类的query方法并且传入储存联系人信息那张数据表的Uri,用于查询联系人信息那张数据表的数据,之后对查询的返回结果Cursor进行处理,将储存联系人信息的ArrayList<String>对象中的数据清空,并且将Cursor对象中储存的数据提取到ArrayList<String>对象中, 之后调用适配器adapter.notifyDataSetChanged来更新适配器中的数据。
来看一下效果:
单击“显示电话簿”按钮:
在这里,如果你用的是模拟器,并且模拟器中没有联系人的话要添加几个联系人。不然就显示的是空界面。这个需要注意一下
如果博客中有什么不正确的地方,还请多多指点。
谢谢观看。。。