day10 ContentProvider 内容提供者、简单视频播放

本文介绍了Android中的ContentProvider组件,用于跨应用数据共享,详细讲解了ContentProvider、ContentResolver和Uri的使用,并给出了获取音频、视频、图片、联系人、短信和通话记录的示例。此外,还探讨了如何实现简单视频音频播放和自定义内容提供者,以实现在不同应用程序间操作数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ContentProvider 内容提供者(四大组件之一)

作用:跨app提供数据
三个要素(1)内容提供者:ContentProvider (2)内容解析者 ContentResolver (3)Uri

补充:

常用权限:

<!--读写联系人-->
<uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission>
<uses-permission android:name="android.permission.WRITE_CONTACTS"></uses-permission>
<!--读写SD卡-->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<!--读写短信-->
<uses-permission android:name="android.permission.READ_SMS"></uses-permission>
<uses-permission android:name="android.permission.WRITE_SMS"></uses-permission>
<!--读写通话记录-->
<uses-permission android:name="android.permission.READ_CALL_LOG"></uses-permission>
<uses-permission android:name="android.permission.WRITE_CALL_LOG"></uses-permission>
<!--网络权限-->
<uses-permission android:name="android.permission.INTERNET"/>

常用Uri:
1.获取音频: (1)uri:MediaStore.Audio.Media.EXTERNAL_CONTENT_URI (2)字段:TITLE:歌名 ARTIST 歌手 DURATION 总时长 DATA 地址
String[] strs= new String[]{MediaStore.Audio.Media.TITLE , MediaStore.Audio.Media.ARTIST , MediaStore.Audio.Media.DURATION , MediaStore.Audio.Media.DATA};
2.获取视频: (1)uri:MediaStore.Video.Media.EXTERNAL_CONTENT_URI (2)字段:TITLE:歌名 ARTIST 歌手 DURATION 总时长 DATA 地址
String[] strs= new String[]{MediaStore.Video.Media.TITLE , MediaStore.Video.Media.ARTIST , MediaStore.Video.Media.DURATION , MediaStore.Video.Media.DATA};
3.获取图库: (1)uri:MediaStore.Images.Media.EXTERNAL_CONTENT_URI (2)字段:
MediaStore.Images.Media.TITLE;图片名称
MediaStore.Images.Media.SIZE;大小
MediaStore.Images.Media.DATA;地址
4.获取联系人: (1)uri:ContactsContract.CommonDataKinds.Phone.CONTENT_URI (2)字段:Phone.DISPLAY_NAME:姓名 NUMBER:电话 String[] strs= new
String[]{ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME , ContactsContract.CommonDataKinds.Phone.NUMBER};
5.获取短信: (1)uriTelephony.Sms.CONTENT_URI (2)字段:ADDRESS 地址 BODY 内容 String[] strs= new
String[]{Telephony.Sms.ADDRESS , Telephony.Sms.BODY};
备注:1 2 3 读sd卡的权限 4 读联系人的权限 5 读短信的权限
6.通话记录:(1)uri:CallLog.Calls.CONTENT_URI
(2)字段:NUMBER:电话号码 DATE:时间 毫秒 DURATION:总时长 秒 TYPE 类型

使用
/**
 * 获取联系人:
 * 权限:<uses-permission android:name="android.permission.READ_CONTACTS"/>
 * (1)uri:ContactsContract.CommonDataKinds.Phone.CONTENT_URI
 * (2)字段:Phone.DISPLAY_NAME:姓名   NUMBER:电话
 * */
public void person(){
    //TODO 1:获得内容解析对象
    ContentResolver contentResolver = getContentResolver();
    //TODO 2:确定Uri
    Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
    //TODO 3:查询
    //参数1 uri,参数2:要查询字段的数组 ,参数3:条件 ,参数4:为条件中的占位符赋值 参数5:排序
    Cursor cursor = contentResolver.query(uri, null, null, null, null);
    //TODO 4:遍历
    while(cursor.moveToNext()){
        //名字和电话号码
        String name = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
        String number = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
    }
}
public class MainActivity extends AppCompatActivity {

    Button btn1,btn2,btn3,btn4;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn1 = findViewById(R.id.person);
        btn2 = findViewById(R.id.picture);
        btn3 = findViewById(R.id.video);
        btn4 = findViewById(R.id.audio);
        btn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                person();
            }
        });
        btn2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                picture();
            }
        });
        btn3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                video();
            }
        });
        btn4.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                audio();
            }
        });
    }

    private void audio() {
        ContentResolver contentResolver = getContentResolver();
        Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
        Cursor cursor = contentResolver.query(uri, null, null, null, null);
        while (cursor.moveToNext()){
            String title = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE));
            String singer = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));
            String location = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA));
            Long size = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.DURATION));
            Toast.makeText(this, title+":"+singer+":"+location+":"+size, Toast.LENGTH_SHORT).show();
        }

    }

    private void video() {
        ContentResolver contentResolver = getContentResolver();
        Uri uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
        Cursor query = contentResolver.query(uri, null, null, null, null);
        while (query.moveToNext()){
            String title = query.getString(query.getColumnIndex(MediaStore.Video.Media.TITLE));
            String location = query.getString(query.getColumnIndex(MediaStore.Video.Media.DATA));
            String singer = query.getString(query.getColumnIndex(MediaStore.Video.Media.ARTIST));
            Long size = query.getLong(query.getColumnIndex(MediaStore.Video.Media.DURATION));
            Toast.makeText(this, title+":"+location+":"+size+":"+singer, Toast.LENGTH_SHORT).show();
        }
    }


    private void picture() {
        ContentResolver contentResolver = getContentResolver();
        Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
        Cursor query = contentResolver.query(uri, null, null, null, null);
        while (query.moveToNext()){
            String title = query.getString(query.getColumnIndex(MediaStore.Images.Media.TITLE));
            String location = query.getString(query.getColumnIndex(MediaStore.Images.Media.DATA));
            Long size = query.getLong(query.getColumnIndex(MediaStore.Images.Media.SIZE));
            Toast.makeText(this, title+":"+location+":"+size, Toast.LENGTH_SHORT).show();
        }
    }

    public void person(){
        ContentResolver contentResolver = getContentResolver();
        Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
        Cursor cursor = contentResolver.query(uri, null, null, null, null);
        while (cursor.moveToNext()){
            String name = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
            String phoneNum = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
            Toast.makeText(this, name+":"+phoneNum, Toast.LENGTH_SHORT).show();
        }
    }
}

简单视频音频播放:

public class VideActivity extends AppCompatActivity {
    ImageView imageView;
    VideoView videoView;
    String img_path="/sdcard/Pictures/b.png";
    String video_path="/sdcard/Movies/day7_使用方法增删改查.mp4";
    String music_path="/sdcard/Music/老狼 - 虎口脱险.mp3";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_vide);
        imageView=findViewById(R.id.iv);
        videoView=findViewById(R.id.vv);
        //图片
        Bitmap bitmap = BitmapFactory.decodeFile(img_path);
        imageView.setImageBitmap(bitmap);

        //视频
        //TODO 1:设置视频资源
        videoView.setVideoPath(video_path);
        //TODO 2:设置控制器
        videoView.setMediaController(new MediaController(this));
        //TODO 3:准备资源
        videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {//准备完成
                //TODO 3:播放
                videoView.start();

            }
        });
        //音乐:MediaPalyer
        //TODO 1:创建MediaPalyer
        final MediaPlayer mediaPlayer=new MediaPlayer();
        //TODO 2:设置音乐资源
        try {
            mediaPlayer.setDataSource(music_path);
            //TODO 3:准备
            mediaPlayer.prepare();
            //TODO 4:准备监听
            mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {//准备完成
                    mediaPlayer.start();
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
自定义内容提供者
跨app之间操作数据

1.内容提供者
数据库:

public class MySQLite extends SQLiteOpenHelper {
    
    public MySQLite(Context context) {
        super(context, "test", null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("create table myTest(id Integer primary key autoincrement,name varchar(20),age Integer)");
        db.execSQL("insert into myTest values (null,'张三',20)");
        db.execSQL("insert into myTest values (null,'李四',19)");
        db.execSQL("insert into myTest values (null,'王五',21)");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    }

ContentProvider类

public class MyProvider extends ContentProvider {

    MySQLite mySQLite;
    SQLiteDatabase database;

    @Override
    public boolean onCreate() {
        mySQLite = new MySQLite(getContext());
        database = mySQLite.getWritableDatabase();
        if (database == null){
            return false;
        }
        return true;
    }

    @Override
    public Cursor query( Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
        Cursor cursor = database.query("myTest", projection, selection, selectionArgs, null, null, sortOrder);
        return cursor;
    }

    @Override
    public String getType( Uri uri) {
        return null;
    }

    @Override
    public Uri insert( Uri uri, ContentValues values) {
        long myTest = database.insert("myTest", null, values);
        if (myTest > 0){
            return uri;
        }
        return null;
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        return database.delete("myTest",selection,selectionArgs);
    }

    @Override
    public int update( Uri uri,  ContentValues values, String selection,  String[] selectionArgs) {
        return database.update("myTest",values,selection,selectionArgs);
    }
}

清单文件注册:

<provider
    android:authorities="com.test.provider"<!-- Uri -->
    android:name=".MyProvider"
    android:exported="true"<!-- 设置其他app可访问数据库数据 -->>
</provider>

2.内容解析者:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ContentResolver contentResolver = getContentResolver();
        Uri uri = Uri.parse("content://com.test.provider");
        Cursor cursor = contentResolver.query(uri, null, null, null,null);
        while (cursor.moveToNext()){
            int id = cursor.getInt(cursor.getColumnIndex("id"));
            int age = cursor.getInt(cursor.getColumnIndex("age"));
            String name = cursor.getString(cursor.getColumnIndex("name"));
            Toast.makeText(this, id+":"+name+":"+age, Toast.LENGTH_SHORT).show();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值