获取U盘路径和读取U盘文件

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;
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sunxiaolin2016

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值