1.只有系统应用才有权限读写U盘文件
2.使用StorageVolume,通过反射的方式获取U盘的绝对路径,系统应用不需要反射
//AudioDatabase.java
//数据库操作
/**
-
A helper class that manages all operations relating to the database. This class should not
-
be accessed directly. Instead, {@link AudioStorage} interfaces directly with it.
*/
public final class AudioDatabase extends SQLiteOpenHelper {
private static final String TAG = “Audio.AudioDatabase”;
private static final String DATABASE_NAME = “AudioDatabase”;
private static final int DATABASE_VERSION = 1;private Context mContext;
private static String mDatabasePath;
SQLiteDatabase mDatabase;
//private final String DATABASE_PATH = android.os.Environment.getExternalStorageDirectory().getAbsolutePath() + “/audio”;private final String DATABASE_PATH;
private String DATABASE_FILENAME = “chime_param.db”;
public AudioDatabase(Context context){
super(context, DATABASE_NAME, null /* factory */, DATABASE_VERSION);
mContext = context;DATABASE_PATH = "/data/data/" + mContext.getPackageName()+"/"+"databases";
}
public SQLiteDatabase openDatabase(String path) {
try {
mDatabasePath = path;
String databaseFilename = DATABASE_PATH + “/” + DATABASE_FILENAME;
Log.i(TAG,“openDatabase,path =” + path);
//File dir = new File(databaseFilename);
//Log.i(TAG,"openDatabase,dir.exists() = " + dir.exists());
//if (!dir.exists())
// dir.mkdir();if(!checkDataBase()){ return null; } Log.i(TAG,"openDatabase,dir.exists() = " + (new File(databaseFilename)).exists()); File dbFile = new File(databaseFilename); if (!dbFile.exists()) { //InputStream is = mContext.getResources().openRawResource(R.raw.chime_param_external); dbFile.getParentFile().mkdir(); dbFile.createNewFile(); File file = new File(path); InputStream is = new FileInputStream(file); FileOutputStream fos = new FileOutputStream(databaseFilename); byte[] buffer = new byte[81920]; int count = 0; while ((count = is.read(buffer)) > 0) { fos.write(buffer, 0, count); } fos.close(); is.close(); } Log.i(TAG,"openDatabase,databaseFilename= " +databaseFilename); mDatabase = SQLiteDatabase.openOrCreateDatabase(databaseFilename, null); return mDatabase; } catch (Exception e) { e.printStackTrace(); } return null;
}
private boolean checkDataBase() {
File dbFile = mContext.getDatabasePath(mDatabasePath);
Log.i(TAG,“dbFile.exists()=” + dbFile.exists());
if (dbFile.exists()) return true;
if (!dbFile.getParentFile().exists()) {
dbFile.getParentFile().mkdirs();
}
return false;
}/**
-
The table that holds all the user’s currently stored presets.
*/
public static final class ChimeTable {
public static final String CHIME_INTER_TABLE_NAME = “Chime_inter”;
public static final String CHIME_EXTER_TABLE_NAME = “Chime_exter”;
public static final String PDC_INTER_TABLE_NAME = “PDC_inter”;
public static final String PDC_EXTER_TABLE_NAME = “PDC_exter”;public static final class Columns {
public static final String CID = “cid”;
public static final String NAME = “name”;
public static final String MASTER_VOLUME = “master_volume”;
public static final String CROSSFADER = “crossfader”;
public static final String ATTACK = “attack”;
public static final String REL_TYPE = “rel_type”;
public static final String RELEASE = “release”;
public static final String TA = “TA”;
public static final String TB = “TB”;
public static final String FS = “fs”;
public static final String ADDITIONAL_BOOST = “additional_boost”;
public static final String REPEAT_TIME = “repeat_time”;
public static final String CHANGE_TH = “change_th”;
public static final String DECAY_TH = “decay_th”;
public static final String EFFECT = “effect”;
public static final String C02 = “c02”;
public static final String C1 = “c1”;
public static final String C3 = “c3”;
public static final String NUMBER = “number”;
public static final String SIGNAL_TYPE1 = “signal_type1”;
public static final String FREQUENCY1 = “frequency1”;
public static final String CLIP1 = “clip1”;
public static final String OUT_AMPLIT1 = “out_amplit1”;
public static final String T1 = “T1”;
public static final String SIGNAL_TYPE2 = “signal_type2”;
public static final String FREQUENCY2 = “frequency2”;
public static final String CLIP2 = “clip2”;
public static final String OUT_AMPLIT2 = “out_amplit2”;
public static final String T2 = “T2”;
public static final String SIGNAL_TYPE3 = “signal_type3”;
public static final String FREQUENCY3 = “frequency3”;
public static final String CLIP3 = “clip3”;
public static final String OUT_AMPLIT3 = “out_amplit3”;
public static final String T3 = “T3”;
public static final String SIGNAL_TYPE4 = “signal_type4”;
public static final String FREQUENCY4 = “frequency4”;
public static final String CLIP4 = “clip4”;
public static final String OUT_AMPLIT4 = “out_amplit4”;
public static final String T4 = “T4”;
public static final String SUPERPOSITION = “superposition”;
}
}
/**
-
查询全部数据
*/
public List queryAllData(String table_name){//查询全部数据
Cursor cursor = mDatabase.query(table_name,null,null,null,null,null,null,null);
List list = new ArrayList<>();if(cursor.getCount() > 0)
{
//移动到首位
cursor.moveToFirst();
for (int i = 0; i < cursor.getCount(); i++) {
int cid = cursor.getInt(cursor.getColumnIndex(CID));
String name = cursor.getString(cursor.getColumnIndex(NAME));
int master_volume = cursor.getInt(cursor.getColumnIndex(MASTER_VOLUME));
int crossfader = cursor.getInt(cursor.getColumnIndex(CROSSFADER));
int attack = cursor.getInt(cursor.getColumnIndex(ATTACK));
int rel_type = cursor.getInt(cursor.getColumnIndex(REL_TYPE));
int release = cursor.getInt(cursor.getColumnIndex(RELEASE));
int ta = cursor.getInt(cursor.getColumnIndex(TA));
int tb = cursor.getInt(cursor.getColumnIndex(TB));
int fs = cursor.getInt(cursor.getColumnIndex(FS));
int additional_boost = cursor.getInt(cursor.getColumnIndex(ADDITIONAL_BOOST));
int repeat_time = cursor.getInt(cursor.getColumnIndex(REPEAT_TIME));
int change_th = cursor.getInt(cursor.getColumnIndex(CHANGE_TH));
int decay_th = cursor.getInt(cursor.getColumnIndex(DECAY_TH));
int effect = cursor.getInt(cursor.getColumnIndex(EFFECT));
int c02 = cursor.getInt(cursor.getColumnIndex(C02));
int c1 = cursor.getInt(cursor.getColumnIndex(C1));
int c3 = cursor.getInt(cursor.getColumnIndex(C3));
int number = cursor.getInt(cursor.getColumnIndex(NUMBER));
String superposition = cursor.getString(cursor.getColumnIndex(SUPERPOSITION));
int signal_type1 = cursor.getInt(cursor.getColumnIndex(SIGNAL_TYPE1));
int frequency1 = cursor.getInt(cursor.getColumnIndex(FREQUENCY1));
int clip1 = cursor.getInt(cursor.getColumnIndex(CLIP1));
int out_amplit1 = cursor.getInt(cursor.getColumnIndex(OUT_AMPLIT1));
int t1 = cursor.getInt(cursor.getColumnIndex(T1));
int signal_type2 = cursor.getInt(cursor.getColumnIndex(SIGNAL_TYPE2));
int frequency2 = cursor.getInt(cursor.getColumnIndex(FREQUENCY2));
int clip2 = cursor.getInt(cursor.getColumnIndex(CLIP2));
int out_amplit2 = cursor.getInt(cursor.getColumnIndex(OUT_AMPLIT2));
int t2 = cursor.getInt(cursor.getColumnIndex(T2));
int signal_type3 = cursor.getInt(cursor.getColumnIndex(SIGNAL_TYPE3));
int frequency3 = cursor.getInt(cursor.getColumnIndex(FREQUENCY3));
int clip3 = cursor.getInt(cursor.getColumnIndex(CLIP3));
int out_amplit3 = cursor.getInt(cursor.getColumnIndex(OUT_AMPLIT3));
int t3 = cursor.getInt(cursor.getColumnIndex(T3));
int signal_type4 = cursor.getInt(cursor.getColumnIndex(SIGNAL_TYPE4));
int frequency4 = cursor.getInt(cursor.getColumnIndex(FREQUENCY4));
int clip4 = cursor.getInt(cursor.getColumnIndex(CLIP4));
int out_amplit4 = cursor.getInt(cursor.getColumnIndex(OUT_AMPLIT4));
int t4 = cursor.getInt(cursor.getColumnIndex(T4));ChimeModel model = new ChimeModel(); model.setCid(cid); model.setCname(name); model.setMaster_volume(master_volume); model.setCrossfader(crossfader); model.setAttack(attack); model.setRel_type(rel_type); model.setRelease(release); model.setTa(ta); model.setTb(tb); model.setFs(fs); model.setAdditional_boost(additional_boost); model.setRepeat_time(repeat_time); model.setChange_th(change_th); model.setDecay_th(decay_th); model.setEffect(effect); model.setC02(c02); model.setC1(c1); model.setC3(c3); model.setNumber(number); model.setSuperposition(superposition); model.setSignal_type1(signal_type1); model.setFrequency1(frequency1); model.setClip1(clip1); model.setOut_amplit1(out_amplit1); model.setT1(t1); model.setSignal_type2(signal_type2); model.setFrequency2(frequency2); model.setClip2(clip2); model.setOut_amplit2(out_amplit2); model.setT2(t2); model.setSignal_type3(signal_type3); model.setFrequency3(frequency3); model.setClip3(clip3); model.setOut_amplit3(out_amplit3); model.setT3(t3); model.setSignal_type4(signal_type4); model.setFrequency4(frequency4); model.setClip4(clip4); model.setOut_amplit4(out_amplit4); model.setT4(t4); Log.i(TAG,"model.getMaster_volume()=" + model.getMaster_volume()); list.add(model); cursor.moveToNext(); }
}
cursor.close();
//getWritableDatabase().close();
mDatabase.close();return list;
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {}
} -
//获取U盘路径
public class FileUtils {
private static final String TAG = “FileUtils”;
/**
* 根据Uri获取图片绝对路径
* @param context context
* @param uri uri
*/
public static String getFileAbsolutePath(Context context, Uri uri) {
if (context == null || uri == null) return null;
// DocumentProvider
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && DocumentsContract.isDocumentUri(context, uri)) {
if (isExternalStorageDocument(uri)) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split("😊;
final String type = split[0];
Log.i(TAG,"docId=" + docId);
Log.i(TAG,"split[0]=" + split[0]);
Log.i(TAG,"split[1]=" + split[1]);
Log.i(TAG,"getUsbPath=" + getUsbPath());
if ("primary".equalsIgnoreCase(type)) {
return Environment.getExternalStorageDirectory() + "/" + split[1];
}else if ("home".equalsIgnoreCase(type)) {
return Environment.getExternalStorageDirectory() + "/documents/" + split[1];
}else{
return getUsbPath() + "/" + split[1];
}
} else if (isDownloadsDocument(uri)) {
// DownloadsProvider
final String id = DocumentsContract.getDocumentId(uri);
if (TextUtils.isEmpty(id)) {
return null;
}
if (id.startsWith("raw:")) {
return id.substring(4);
}
String[] contentUriPrefixesToTry = new String[]{
"content://downloads/public_downloads",
"content://downloads/my_downloads",
"content://downloads/all_downloads"
};
for (String contentUriPrefix : contentUriPrefixesToTry) {
try {
Uri contentUri = ContentUris.withAppendedId(Uri.parse(contentUriPrefix), Long.valueOf(id));
String path = getDataColumn(context, contentUri, null, null);
if (path != null) {
return path;
}
} catch (Exception ignore) {
}
}
try {
String path = getDataColumn(context, uri, null, null);
if (path != null) {
return path;
}
} catch (Exception ignore) {
}
// path could not be retrieved using ContentResolver, therefore copy file to accessible cache using streams
return null;
} else if (isMediaDocument(uri)) {
// MediaProvider
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];
Uri contentUri;
Log.i(TAG,"type.toLowerCase(Locale.ENGLISH)=" + type.toLowerCase(Locale.ENGLISH));
switch (type.toLowerCase(Locale.ENGLISH)) {
case "image":
contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
break;
case "video":
contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
break;
case "audio":
contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
break;
default:
contentUri = MediaStore.Files.getContentUri("external");
break;
}
final String selection = MediaStore.MediaColumns._ID +"=?";
final String[] selectionArgs = new String[]{split[1]};
return getDataColumn(context, contentUri, selection, selectionArgs);
}
} else if (ContentResolver.SCHEME_CONTENT.equalsIgnoreCase(uri.getScheme())) {
// MediaStore (and general)
// Return the remote address
if (isGooglePhotosUri(uri)) {
return uri.getLastPathSegment();
}
return getDataColumn(context, uri, null, null);
} else if (ContentResolver.SCHEME_FILE.equalsIgnoreCase(uri.getScheme())) {
// File
return uri.getPath();
}
return null;
}
/**
* 通过游标获取当前文件路径
* @param context context
* @param uri uri
* @param selection selection
* @param selectionArgs selectionArgs
* @return 路径,未找到返回null
*/
public static String getDataColumn(Context context, @NonNull Uri uri, String selection, String[] selectionArgs) {
Cursor cursor = null;
String column = MediaStore.Images.Media.DATA;
String[] projection = {column};
try {
cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null);
if (cursor != null && cursor.moveToFirst()) {
int index = cursor.getColumnIndexOrThrow(column);
return cursor.getString(index);
}
} catch (Exception ignore) {
} finally {
if (cursor != null)
cursor.close();
}
return null;
}
public static boolean isExternalStorageDocument(Uri uri) {
return "com.android.externalstorage.documents".equals(uri.getAuthority());
}
public static boolean isDownloadsDocument(Uri uri) {
return "com.android.providers.downloads.documents".equals(uri.getAuthority());
}
public static boolean isMediaDocument(Uri uri) {
return "com.android.providers.media.documents".equals(uri.getAuthority());
}
public static boolean isGooglePhotosUri(Uri uri) {
return "com.google.android.apps.photos.content".equals(uri.getAuthority());
}
private static String getUsbPath(){
StorageManager mStorageManager;
mStorageManager = (StorageManager) AudioApplication.getInstance().getSystemService(Context.STORAGE_SERVICE);
//获取所有挂载的设备(内部sd卡、外部sd卡、挂载的U盘)
List<StorageVolume> volumes = mStorageManager.getStorageVolumes();
String path = null;
try {
Class<?> storageVolumeClazz = Class
.forName("android.os.storage.StorageVolume");
//通过反射调用系统hide的方法
Method getPath = storageVolumeClazz.getMethod("getPath");
Method isRemovable = storageVolumeClazz.getMethod("isRemovable");
for (int i = 0; i < volumes.size(); i++) {
StorageVolume storageVolume = volumes.get(i);//获取每个挂载的StorageVolume
//通过反射调用getPath、isRemovable
String storagePath = (String) getPath.invoke(storageVolume); //获取路径
boolean isRemovableResult = (boolean) isRemovable.invoke(storageVolume);//是否可移除
String description = storageVolume.getDescription(AudioApplication.getInstance());
//Log.d(TAG, " i=" + i + " ,storagePath=" + storagePath + " ,isRemovableResult=" + isRemovableResult +" ,description="+description);
if(isRemovableResult){
path = storagePath;
}
}
} catch (Exception e) {
Log.d("jason", " e:" + e);
}
return path;
}
}