近来使用下项目上用的不多的东西在自己的app,记录下遇到的问题:
项目地址:码云
在AndroidManifest.xml添加provider时,权限问题。添加android:permission=”…”,这样控制其他app访问权限使app更加安全,permission是允许读写权限,writepermission是允许写权限,readpermission是允许读权限
<provider
android:name="com.bobbygu.bobbyapp.function.contentprovider.TeacherContentProvider"
android:authorities="com.bobbygu.contentProvider"
android:exported="true"
android:multiprocess="false"
android:permission="com.bobbygu.permission.CONTENTPROVIDER" />
然后在 application
外面添加下面代码
<permission
android:name="com.bobbygu.permission.CONTENTPROVIDER"
android:label="Allow read content provider"
android:protectionLevel="normal" />
Service同样可以这样设置权限
<service
android:name="com.bobbygu.bobbyapp.function.aidlSample.AIDLService"
android:enabled="true"
android:exported="true"
android:permission="com.bobbygu.permission.CONTENTPROVIDER">
<intent-filter>
<action android:name="com.bobby.aidl.BobbyService" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</service>
在第二个app的Manifest中需要添加
<uses-permission android:name="com.bobbygu.permission.CONTENTPROVIDER"/>
获取contentprovider需要的权限
然后应用就可以开始使用contentProvider获取更新数据了
class ContentProviderTestActivity : AppCompatActivity(), View.OnClickListener {
private var uri = Uri.parse("content://com.bobbygu.contentProvider/teacher")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_content_provider_test)
btn_insert.setOnClickListener(this)
btn_query.setOnClickListener(this)
btn_query_all.setOnClickListener(this)
btn_modify.setOnClickListener(this)
btn_delete.setOnClickListener(this)
}
override fun onClick(v: View?) {
when (v?.id) {
R.id.btn_insert -> {
val cv = ContentValues()
cv.put("title", "jiaoshou")
cv.put("name", "jiaoshi")
cv.put("sex", true)
val uri2 = contentResolver.insert(uri, cv)
SweetAlertDialog(this)
.setTitleText(getString(R.string.dialog_title))
.setContentText(uri2.toString())
.show()
Logger.d(uri2.toString())
}
R.id.btn_query -> {
// 查找id为1的数据
val c = contentResolver.query(uri, null, "_ID=?", arrayOf("1"), null)
//这里必须要调用 c.moveToFirst将游标移动到第一条数据,不然会出现index -1 requested , with a size of 1错误;cr.query返回的是一个结果集。
if (!c!!.moveToFirst()) {
// 为空的Cursor
SweetAlertDialog(this, SweetAlertDialog.ERROR_TYPE)
.setTitleText(getString(R.string.dialog_title))
.setContentText("未找到id=1的数据")
.show()
return
}
val name = c.getColumnIndex("name")
Logger.d(c.getString(name))
SweetAlertDialog(this)
.setTitleText(getString(R.string.dialog_title))
.setContentText(c.getString(name))
.show()
c.close()
}
R.id.btn_query_all -> {
val c = contentResolver.query(uri, null, null, null, null)
var str = ""
while (c.moveToNext()) {
str += c.getInt(c.getColumnIndex("_id")).toString() + "\n"
}
Logger.d("count:${c!!.count} \n$str")
SweetAlertDialog(this)
.setTitleText(getString(R.string.dialog_title))
.setContentText("count:${c.count} \n$str")
.show()
c.close()
}
R.id.btn_modify -> {
val cv = ContentValues()
cv.put("name", "huangbiao")
cv.put("date_added", Date().toString())
val updatedNum = contentResolver.update(uri, cv, "_ID=?", arrayOf("3"))
println("updated" + ":" + updatedNum)
if (updatedNum == 0)
SweetAlertDialog(this, SweetAlertDialog.ERROR_TYPE)
.setTitleText(getString(R.string.dialog_title))
.setContentText("数据更新失败")
.show()
else
SweetAlertDialog(this)
.setTitleText(getString(R.string.dialog_title))
.setContentText("updated" + ":" + updatedNum)
.show()
}
R.id.btn_delete -> {
val c = contentResolver.query(uri, null, null, null, null)
if (!c!!.moveToFirst()) {
SweetAlertDialog(this, SweetAlertDialog.ERROR_TYPE)
.setTitleText(getString(R.string.dialog_title))
.setContentText("数据删除失败")
.show()
return
}
val index = c.getInt(c.getColumnIndex("_id")).toString()
contentResolver.delete(uri, "_ID=?", arrayOf(index))
SweetAlertDialog(this, SweetAlertDialog.SUCCESS_TYPE)
.setTitleText(getString(R.string.dialog_title))
.setContentText("btn_delete index:$index")
.show()
c.close()
}
}
}
companion object {
fun startActivity(activity: Activity) {
activity.startActivity(Intent(activity, ContentProviderTestActivity::class.java))
}
}
}