美文网首页DevSupport鱼乐
Android 6.0获取外置SD卡的路径

Android 6.0获取外置SD卡的路径

作者: Exception_Cui | 来源:发表于2017-04-12 17:40 被阅读1970次

    6.0外置SD卡路径

    StorageManager mStorageManager = StorageManager.from(this);
            final List<VolumeInfo> vols = mStorageManager.getVolumes();
            VolumeInfo sdcardVolume = null ;
             
            for(VolumeInfo vol : vols){
              if(vol.getDisk() != null && vol.getDisk().isSd())sdcardVolume = vol;
              //如果需要获取usbotg的路径,则改为
               // if(vol.getDisk() != null &&vol.getDisk().isUsb()) usbotgVolume = vol;
            }
             
            if(sdcardVolume!= null) {
               String sdcardPath = sdcardVolume.getPath()==null ? null :sdcardVolume.getPath().toString();
               String sdcardState = sdcardVolume.getEnvironmentForState(sdcardVolume.getState());
               if(sdcardState.equals(Environment.MEDIA_MOUNTED) && sdcardPath != null){
                    //外置SD卡已挂载,且路径有效
                    // sdcardPath 外置SD卡的路径
                   Toast.makeText(this, sdcardPath, 1000).show();
               }       
            }
    

    5.1 6.0通用获取内置外事SD卡

    public String[] getExtSDCardPath() {
                StorageManager storageManager = (StorageManager) getSystemService(Context
                        .STORAGE_SERVICE);
                try {
                    Class<?>[] paramClasses = {};
                    Method getVolumePathsMethod = StorageManager.class.getMethod("getVolumePaths", paramClasses);
                    getVolumePathsMethod.setAccessible(true);
                    Object[] params = {};
                    Object invoke = getVolumePathsMethod.invoke(storageManager, params);
                    return (String[])invoke;
                } catch (NoSuchMethodException e1) {
                    e1.printStackTrace();
                } catch (IllegalArgumentException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    e.printStackTrace();
                }
                return null;
            }
    

    5.1外置SD卡大小

    private volatile static Parcelable[] volumes = null;
        private Parcelable[] getVolumes() {
            if (volumes == null) {
                try {
                    IMountService mountService = IMountService.Stub.asInterface(ServiceManager
                            .getService("mount"));
                    volumes = mountService.getVolumeList();   
                    } catch (Exception e) {
                        Log.e(TAG, "couldn't talk to MountService", e);
                    }
             }
                return volumes;
        }
        public void volumeSizeTest(){
            String tips = new String();
        Parcelable[] volumes = getVolumes();
        for (int i = 0; i < volumes.length; i++){
            StorageVolume vol = (StorageVolume)volumes[i];
            if( vol.getPath().contains("/storage/sdcard") ){
                android.os.StatFs statfs = new android.os.StatFs(vol.getPath());
                    long nTotalBlocks = statfs.getBlockCount();
                    long nBlocSize = statfs.getBlockSize();
                    long nAvailaBlock = statfs.getAvailableBlocks();
                    long nSDTotalSize = nTotalBlocks * nBlocSize / 1024 / 1024;
                    long nSDFreeSize = nAvailaBlock * nBlocSize / 1024 / 1024;
            tips += vol.getDescription(getApplicationContext()) + "\n\n" 
                + getString(R.string.sdcard_totalsize) + nSDTotalSize + "MB" + "\n\n" 
                + getString(R.string.sdcard_freesize) + nSDFreeSize + "MB"+"\n\n" ;
            }
            }
            mInfo.setText(tips);
        } 
        public void SDCardSizeTest() {
            String sDcString = Environment.getExternalStorageState();
            if (sDcString.equals(Environment.MEDIA_MOUNTED)) {
    
                java.io.File pathFile = Environment.getExternalStorageDirectory();
    
                android.os.StatFs statfs = new android.os.StatFs(pathFile.getPath());
    
                long nTotalBlocks = statfs.getBlockCount();
    
                long nBlocSize = statfs.getBlockSize();
    
                long nAvailaBlock = statfs.getAvailableBlocks();
    
                long nSDTotalSize = nTotalBlocks * nBlocSize / 1024 / 1024;
    
                long nSDFreeSize = nAvailaBlock * nBlocSize / 1024 / 1024;
    
                mInfo.setText(getString(R.string.sdcard_tips_success) + "\n\n"
                        + getString(R.string.sdcard_totalsize) + nSDTotalSize + "MB" + "\n\n"
                        + getString(R.string.sdcard_freesize) + nSDFreeSize + "MB");
            } else {
                mInfo.setText(getString(R.string.sdcard_tips_failed));
            }
        }
    

    6.0外置SD卡大小

    
    package com.mediatek.factorymode.sdcard;
    
    import android.app.Activity;
    import android.content.Context;
    import android.content.SharedPreferences;
    import android.os.Bundle;
    import android.os.Environment;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.TextView;
    
    import com.mediatek.factorymode.AppDefine;
    import com.mediatek.factorymode.R;
    import com.mediatek.factorymode.Utils;
    
    import android.os.storage.IMountService;
    import android.os.storage.StorageVolume;
    import android.util.Log;
    import android.os.Parcelable;
    import java.io.File;
    import android.os.ServiceManager;
    
    import android.os.StatFs;
    
    
    
    import android.content.pm.ApplicationInfo;
    import android.content.pm.PackageManager;
    import android.content.pm.PackageManager.NameNotFoundException;
    
    public class SDCard extends Activity implements OnClickListener {
        private TextView mInfo;
    
        private Button mBtOk;
    
        private Button mBtFailed;
    
        // add by zh
        private int uid;
    
        private SharedPreferences mSp;
        private static final String TAG = "SDCard";
    
        String path="/storage/sdcard1";
        boolean  exist= false;
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.sdcard);
            mSp = getSharedPreferences("FactoryMode", Context.MODE_PRIVATE);
            mInfo = (TextView) findViewById(R.id.sdcard_info);
            exist = fileIsExists(path);
            if(exist){
                Log.i(TAG, "sdcard1 exist");
            }else{
                Log.i(TAG, "sdcard1 does not exist");
                }
    
            doMethod01();
    
            
            volumeSizeTest(exist);
    }   
    
        public boolean fileIsExists(String strFile)  
           {  
               try  
               {  
                   File f=new File(strFile);  
                   if(!f.exists())  
                   {  
                           return false;  
                   }  
         
               }  
               catch (Exception e)  
               {  
                   return false;  
               }  
         
               return true;  
           }  
    
        /**获得当前sdcard的存储状态*/
        public void doMethod01(){
            //获得当前sdcard的存储状态
            String state=Environment.
            getExternalStorageState();
            
            //Environment类中提供了
            //一些常量用于记录sdcard状态
            if(Environment.MEDIA_MOUNTED.
                equals(state)){
                Log.i("TAG", "sdcard 已经挂载!");
            }
        }
     
        public void volumeSizeTest(boolean existed){
    /*        String tips = new String();
        Parcelable[] volumes = getVolumes();
        for (int i = 0; i < volumes.length; i++){
            StorageVolume vol = (StorageVolume)volumes[i];
            if( vol.getPath().contains("/storage/sdcard") ){
                android.os.StatFs statfs = new android.os.StatFs(vol.getPath());
                
                    //获得外部存储sdcard的根目录
                    File sdcard=Environment.getExternalStorageDirectory();
                    //获得存储空间大小
                    StatFs f=new StatFs(sdcard.getPath());
                    long nTotalBlocks = f.getBlockCount();
                    long nBlocSize = f.getBlockSize();
                    long nAvailaBlock = f.getAvailableBlocks();
                    long nSDTotalSize = nTotalBlocks * nBlocSize / 1024 / 1024;
                    long nSDFreeSize = nAvailaBlock * nBlocSize / 1024 / 1024;
            tips += vol.getDescription(getApplicationContext()) + "\n\n" 
                + getString(R.string.sdcard_totalsize) + nSDTotalSize + "MB" + "\n\n" 
                + getString(R.string.sdcard_freesize) + nSDFreeSize + "MB"+"\n\n" ;
    */
    
            if(existed){
            
            StatFs f=new StatFs(path);
            
            long blockSize= f.getBlockSizeLong();
            long totalSize=f.getBlockCountLong();
            long availableBlocks=f.getAvailableBlocksLong();
    
            double sd1=(blockSize*totalSize*1.0)/1024/1024/1024;
            double sd2=(blockSize*availableBlocks*1.0)/1024/1024/1024;
            
            String totalSize1 = String.valueOf(sd1);
            String str1 = totalSize1.substring(0, 5);
                
            String availableBlocks1 = String.valueOf(sd2);
            String str2 = availableBlocks1.substring(0, 5);
            
            mInfo.setText("Available:"+ str2+"GB"+"\n\n"+"Total space:"
                +str1+"GB");
                }else{
                 mInfo.setText("NO T-card found!");
                    }
        } 
        
        private String getSDCard2MemoryPath() {
                        return "/storage/sdcard1";
                }
    
        private StatFs getStatFs(String path) {
                    try {
                            return new StatFs(path);
                    } catch (Exception e) {
                            e.printStackTrace();
                    }
                    return null;
            }
    }
    
    

    相关文章

      网友评论

      • you的日常:import android.os.storage.VolumeInfo;

        要引用这个,但是这只能在源码中使用.
      • 莫西_v:VolumeInfo类是要引用什么包吗

      本文标题:Android 6.0获取外置SD卡的路径

      本文链接:https://www.haomeiwen.com/subject/ttnmattx.html