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.ExternalStorageDirectory().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/" + PackageName()+"/"+"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,"ists() = " + ists());
//if (!ists())
// dir.mkdir();
if(!checkDataBase()){return null;}Log.i(TAG,"ists() = " + (new File(databaseFilename)).exists());File dbFile = new File(databaseFilename);if (!ists()) {//InputStream is = Resources().openRawResource(R.raw.chime_param_external);ParentFile().mkdir();ateNewFile();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 = DatabasePath(mDatabasePath);
Log.i(TAG,“ists()=” + ists());
if (ists()) return true;
if (!ParentFile().exists()) {
ParentFile().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<>();
Count() > 0)
{
//移动到首位
veToFirst();
for (int i = 0; i < Count(); i++) {
int cid = ColumnIndex(CID));
String name = ColumnIndex(NAME));
int master_volume = ColumnIndex(MASTER_VOLUME));
int crossfader = ColumnIndex(CROSSFADER));
int attack = ColumnIndex(ATTACK));
int rel_type = ColumnIndex(REL_TYPE));
int release = ColumnIndex(RELEASE));
int ta = ColumnIndex(TA));
int tb = ColumnIndex(TB));
int fs = ColumnIndex(FS));
int additional_boost = ColumnIndex(ADDITIONAL_BOOST));
int repeat_time = ColumnIndex(REPEAT_TIME));
int change_th = ColumnIndex(CHANGE_TH));
int decay_th = ColumnIndex(DECAY_TH));
int effect = ColumnIndex(EFFECT));
int c02 = ColumnIndex(C02));
int c1 = ColumnIndex(C1));
int c3 = ColumnIndex(C3));
int number = ColumnIndex(NUMBER));
String superposition = ColumnIndex(SUPERPOSITION));
int signal_type1 = ColumnIndex(SIGNAL_TYPE1));
int frequency1 = ColumnIndex(FREQUENCY1));
int clip1 = ColumnIndex(CLIP1));
int out_amplit1 = ColumnIndex(OUT_AMPLIT1));
int t1 = ColumnIndex(T1));
int signal_type2 = ColumnIndex(SIGNAL_TYPE2));
int frequency2 = ColumnIndex(FREQUENCY2));
int clip2 = ColumnIndex(CLIP2));
int out_amplit2 = ColumnIndex(OUT_AMPLIT2));
int t2 = ColumnIndex(T2));
int signal_type3 = ColumnIndex(SIGNAL_TYPE3));
int frequency3 = ColumnIndex(FREQUENCY3));
int clip3 = ColumnIndex(CLIP3));
int out_amplit3 = ColumnIndex(OUT_AMPLIT3));
int t3 = ColumnIndex(T3));
int signal_type4 = ColumnIndex(SIGNAL_TYPE4));
int frequency4 = ColumnIndex(FREQUENCY4));
int clip4 = ColumnIndex(CLIP4));
int out_amplit4 = ColumnIndex(OUT_AMPLIT4));
int t4 = ColumnIndex(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,Master_volume()=" + Master_volume());list.add(model);veToNext();}
}
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 = DocumentId(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)) {ExternalStorageDirectory() + "/" + split[1];}else if ("home".equalsIgnoreCase(type)) {ExternalStorageDirectory() + "/documents/" + split[1];}else{return getUsbPath() + "/" + split[1];}} else if (isDownloadsDocument(uri)) {// DownloadsProviderfinal String id = DocumentId(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 streamsreturn null;} else if (isMediaDocument(uri)) {// MediaProviderfinal String docId = DocumentId(uri);final String[] split = docId.split(":");final String type = split[0];Uri contentUri;Log.i(TAG,LowerCase(Locale.ENGLISH)=" + LowerCase(Locale.ENGLISH));switch (LowerCase(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 = ContentUri("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.Scheme())) {// MediaStore (and general)// Return the remote addressif (isGooglePhotosUri(uri)) {LastPathSegment();}return getDataColumn(context, uri, null, null);} else if (ContentResolver.SCHEME_FILE.Scheme())) {// Path();}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 = ContentResolver().query(uri, projection, selection, selectionArgs, null);if (cursor != null && veToFirst()) {int index = ColumnIndexOrThrow(column);String(index);}} catch (Exception ignore) {} finally {if (cursor != null)cursor.close();}return null;
}public static boolean isExternalStorageDocument(Uri uri) {return "alstorage.documents".Authority());
}public static boolean isDownloadsDocument(Uri uri) {return "com.android.providers.downloads.documents".Authority());
}public static boolean isMediaDocument(Uri uri) {return "com.dia.documents".Authority());
}public static boolean isGooglePhotosUri(Uri uri) {return le.android.t".Authority());
}private static String getUsbPath(){StorageManager mStorageManager;mStorageManager = (StorageManager) Instance().getSystemService(Context.STORAGE_SERVICE);//获取所有挂载的设备(内部sd卡、外部sd卡、挂载的U盘)List<StorageVolume> volumes = StorageVolumes();String path = null;try {Class<?> storageVolumeClazz = Class.forName("android.os.storage.StorageVolume");//通过反射调用系统hide的方法Method getPath = Method("getPath");Method isRemovable = Method("isRemovable");for (int i = 0; i < volumes.size(); i++) {StorageVolume storageVolume = (i);//获取每个挂载的StorageVolume//通过反射调用getPath、isRemovableString storagePath = (String) getPath.invoke(storageVolume); //获取路径boolean isRemovableResult = (boolean) isRemovable.invoke(storageVolume);//是否可移除String description = Instance());//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;
}
}
本文发布于:2024-01-30 04:19:49,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170655959119167.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |