使用contentprovider获取本地音乐的代码
时间: 2023-10-27 14:08:14 浏览: 47
首先需要在AndroidManifest.xml文件中声明一个Provider:
```
<provider
android:name=".MusicProvider"
android:authorities="com.example.musicprovider"
android:exported="true" />
```
然后创建一个MusicProvider类,继承ContentProvider,并实现相应的方法:
```java
public class MusicProvider extends ContentProvider {
private static final String AUTHORITY = "com.example.musicprovider";
private static final String MUSIC_PATH = "music";
private static final int MUSIC = 1;
private static final UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
static {
uriMatcher.addURI(AUTHORITY, MUSIC_PATH, MUSIC);
}
private MusicDbHelper dbHelper;
@Override
public boolean onCreate() {
dbHelper = new MusicDbHelper(getContext());
return true;
}
@Nullable
@Override
public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
SQLiteDatabase db = dbHelper.getReadableDatabase();
Cursor cursor;
switch (uriMatcher.match(uri)) {
case MUSIC:
cursor = db.query(MusicContract.TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder);
break;
default:
throw new IllegalArgumentException("Unknown URI: " + uri);
}
cursor.setNotificationUri(getContext().getContentResolver(), uri);
return cursor;
}
@Nullable
@Override
public String getType(@NonNull Uri uri) {
switch (uriMatcher.match(uri)) {
case MUSIC:
return MusicContract.CONTENT_TYPE;
default:
throw new IllegalArgumentException("Unknown URI: " + uri);
}
}
@Nullable
@Override
public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
long id;
switch (uriMatcher.match(uri)) {
case MUSIC:
id = db.insert(MusicContract.TABLE_NAME, null, values);
break;
default:
throw new IllegalArgumentException("Unknown URI: " + uri);
}
getContext().getContentResolver().notifyChange(uri, null);
return Uri.withAppendedPath(uri, String.valueOf(id));
}
@Override
public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
int count;
switch (uriMatcher.match(uri)) {
case MUSIC:
count = db.delete(MusicContract.TABLE_NAME, selection, selectionArgs);
break;
default:
throw new IllegalArgumentException("Unknown URI: " + uri);
}
getContext().getContentResolver().notifyChange(uri, null);
return count;
}
@Override
public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
int count;
switch (uriMatcher.match(uri)) {
case MUSIC:
count = db.update(MusicContract.TABLE_NAME, values, selection, selectionArgs);
break;
default:
throw new IllegalArgumentException("Unknown URI: " + uri);
}
getContext().getContentResolver().notifyChange(uri, null);
return count;
}
}
```
其中,MusicContract是一个定义了表名、列名等相关信息的类:
```java
public class MusicContract {
public static final String TABLE_NAME = "music";
public static final String COLUMN_ID = "_id";
public static final String COLUMN_TITLE = "title";
public static final String COLUMN_ARTIST = "artist";
public static final String COLUMN_ALBUM = "album";
public static final String COLUMN_DURATION = "duration";
public static final String COLUMN_PATH = "path";
public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.example.musicprovider.music";
public static final String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME + " (" +
COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
COLUMN_TITLE + " TEXT," +
COLUMN_ARTIST + " TEXT," +
COLUMN_ALBUM + " TEXT," +
COLUMN_DURATION + " INTEGER," +
COLUMN_PATH + " TEXT)";
}
```
接下来在Activity中使用ContentResolver来访问Provider:
```java
public class MainActivity extends AppCompatActivity {
private ListView listView;
private SimpleCursorAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = findViewById(R.id.listView);
String[] from = {MusicContract.COLUMN_TITLE, MusicContract.COLUMN_ARTIST};
int[] to = {android.R.id.text1, android.R.id.text2};
Cursor cursor = getContentResolver().query(Uri.parse("content://com.example.musicprovider/music"), null, null, null, null);
adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_2, cursor, from, to, 0);
listView.setAdapter(adapter);
}
}
```
以上代码可以获取本地存储器上的音乐文件,并在ListView中显示出来。需要注意的是,还需要在AndroidManifest.xml文件中声明读取外部存储器的权限:
```
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
```