Android之内置和外置sdcard路径显示并且写入数据的方法

 更新时间:2018年08月01日 14:19:26   作者:chenyu_insist  
今天小编就为大家分享一篇Android之内置和外置sdcard路径显示并且写入数据的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

1、效果图片

2、部分代码

package com.example.sdcardcheck;
 
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.Array;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
 
import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.storage.StorageManager;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
 
public class MainActivity extends ActionBarActivity {
 
	public static String TAG = "SdCardCheck";
	public TextView mTv;
	public Button mBtIn;
	public Button mBtout;
	public String result = "";
	public String inSdcardPath = "";
	public String outSdcaraPath = "";
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		mTv = (TextView)findViewById(R.id.text);
		mBtIn = (Button)findViewById(R.id.button_in);
		mBtout = (Button)findViewById(R.id.button_out);
//		checkPerssiom();
		mBtIn.setOnClickListener(new OnClickListener(){
			@Override
			public void onClick(View v) {
				// 获取SD卡的目录
				saveDataToSdcard(inSdcardPath, "inSdcard_text.txt");
			}
		});
		mBtout.setOnClickListener(new OnClickListener(){
			@Override
			public void onClick(View v) {
				saveDataToSdcard(outSdcaraPath, "outSdcard_text.txt");
			}
		});
		checkSd();
		getCommonPath();
		getStoragePath(this, true);
		getStoragePath(this, false);
		getExternalStoreAvailableSize();
		mTv.setText(result);
	}
	
	public void checkSd() {
		String state = Environment.getExternalStorageState();
		result += "Environment.MEDIA_MOUNTED is:" + state.equals(Environment.MEDIA_MOUNTED) + "\n";
		result += "Environment.MEDIA_MOUNTED_READ_ONLY is:" + state.equals(Environment.MEDIA_MOUNTED_READ_ONLY) + "\n";
		result += "Environment.MEDIA_SHARED is:" + state.equals(Environment.MEDIA_SHARED) + "\n";
		
		Log.d(TAG, "state.equals(Environment.MEDIA_MOUNTED is:" + state.equals(Environment.MEDIA_MOUNTED));
		Log.d(TAG, "state.equals(Environment.MEDIA_MOUNTED_READ_ONLY is:" + state.equals(Environment.MEDIA_MOUNTED_READ_ONLY));
		Log.d(TAG, "state.equals(Environment.MEDIA_SHARED is:" + state.equals(Environment.MEDIA_SHARED));
	}
	
	public String getStoragePath(Context mContext, boolean is_removale) { 
		StorageManager mStorageManager = (StorageManager) mContext.getSystemService(Context.STORAGE_SERVICE);
		Class<?> storageVolumeClazz = null;
		try {
			storageVolumeClazz = Class.forName("android.os.storage.StorageVolume");
			Method getVolumeList = mStorageManager.getClass().getMethod("getVolumeList");
			Method getPath = storageVolumeClazz.getMethod("getPath");
			Method isRemovable = storageVolumeClazz.getMethod("isRemovable");
			Object resultObject = getVolumeList.invoke(mStorageManager);
			final int length = Array.getLength(resultObject);
			for (int i = 0; i < length; i++) {
				Object storageVolumeElement = Array.get(resultObject, i);
				 String path = (String) getPath.invoke(storageVolumeElement);
				 boolean removable = (Boolean) isRemovable.invoke(storageVolumeElement);
				 if (is_removale == removable) {
					if (is_removale) {
					 result += "sdcard外部存储路经" + path + "\n";
					 outSdcaraPath = path;
					} else {
					 result += "sdcard内部存储路经" + path + "\n";
					 inSdcardPath = path;
					}
					return path;
				 }
			}
	 } catch (ClassNotFoundException e) {
	 	e.printStackTrace();
		} catch (InvocationTargetException e) {
		 e.printStackTrace();
		} catch (NoSuchMethodException e) {
		 e.printStackTrace();
		} catch (IllegalAccessException e) {
		 e.printStackTrace();
		}
		return null;
	}
	
	
	public void showSdCard() {
		//String sdcardPath = System.getenv("EXTERNAL_STORAGE");
		String sdcardPath = Environment.getExternalStorageDirectory().getAbsolutePath();
		result += "sdcard内部存储路经" + sdcardPath + "\n";
		String extSdcardPaht = System.getenv("SECONDARY_STORAGE");
		result += "sdcard外部存储路经" + extSdcardPaht + "\n";
		
	}
 /** 
  * 得到外部存储可用的空间 
  * @return 剩余空间的大小,单位是Byte 
  */ 
 public long getExternalStoreAvailableSize(){ 
 	String state = Environment.getExternalStorageState();
  if(state.equals(Environment.MEDIA_MOUNTED) || state.equals(Environment.MEDIA_SHARED)) { 
   // 取得sdcard文件路径 
   File pathFile = Environment.getExternalStorageDirectory(); 
   android.os.StatFs statfs = new android.os.StatFs(pathFile.getPath()); 
   // 获取SDCard上每个block的SIZE 
   long nBlocSize = statfs.getBlockSize(); 
   // 获取可供程序使用的Block的数量 
   long nAvailaBlock = statfs.getAvailableBlocks(); 
   // 计算 SDCard 剩余大小Byte 
   long nSDFreeSize = nAvailaBlock * nBlocSize ;
   if (nSDFreeSize > 1024 * 1024 * 1024) {
   	result += "外部存储可用的空间:" + nSDFreeSize/(1024 * 1024 * 1024) + "G\n";
   } else {
   	result += "外部存储可用的空间:" + nSDFreeSize + "Byte\n";
   }
   return nSDFreeSize; 
  } else {
  	result += "size:" + "0" + "\n";
  }
  return 0; 
 } 
 
// public void checkPerssiom() {
// 	if (Build.VERSION.SDK_INT >= 23) { 
// 		 int REQUEST_CODE_CONTACT = 101;
//  		 String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE}; 
//  		 //验证是否许可权限    
//  		 for (String str : permissions) {     
//  			 if (this.checkSelfPermission(str) != PackageManager.PERMISSION_GRANTED) { 
//  				 //申请权限      
//  				 this.requestPermissions(permissions, REQUEST_CODE_CONTACT); 
//  				 return;
//  			 } else {
//  				 Log.d(TAG, "this.checkSelfPermission(str) == PackageManager.PERMISSION_GRANTED");
//  			 }
//  	 } 
// 	}
//	}
 
 public void getCommonPath() {
 	File file = Environment.getExternalStorageDirectory();
 	String path = file.getAbsolutePath();
 	result += "sdcard存储路经" + path + "\n";
 	mTv.post(new Runnable(){
			@Override
			public void run() {
				mTv.setText(result);
			}
		});
 }
 public void saveDataToSdcard(String path, String fileName) {
 	if ("".equals(path) || path == null) {
 		result += "path is null or ''" + "\n";
 		mTv.post(new Runnable(){
				@Override
				public void run() {
					mTv.setText(result);
				}
 		});
 		return;
 	} 
 	String str = "sangfor";
		File sdDire = Environment.getExternalStorageDirectory();
		FileOutputStream outFileStream;
		try {
			outFileStream = new FileOutputStream(path + File.separator + fileName);
			outFileStream.write(str.getBytes());
			outFileStream.close();     
			Toast.makeText(MainActivity.this, fileName +"文件保存成功", Toast.LENGTH_LONG).show(); 
		} catch (Exception e) {
			e.printStackTrace();
			result += "save " + fileName +"fail" + "\n";
			mTv.post(new Runnable(){
				@Override
				public void run() {
					mTv.setText(result);
				}
 		});
			Log.e(TAG, "save file fail");
		} 
 }
}
 

以上这篇Android之内置和外置sdcard路径显示并且写入数据的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Android编程实现改变控件背景及形态的方法

    Android编程实现改变控件背景及形态的方法

    这篇文章主要介绍了Android编程实现改变控件背景及形态的方法,涉及Android控件布局设置的相关技巧,需要的朋友可以参考下
    2016-02-02
  • Android自定义控件实现短信验证码自动填充

    Android自定义控件实现短信验证码自动填充

    这篇文章主要为大家详细介绍了Android自定义控件实现短信验证码自动填充,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • ProxyWidget和Element更新的正确方式详解

    ProxyWidget和Element更新的正确方式详解

    这篇文章主要为大家介绍了ProxyWidget和Element更新的正确方式详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • Android使用DocumentFile读写外置存储的问题

    Android使用DocumentFile读写外置存储的问题

    大家好,本篇文章主要讲的是Android使用DocumentFile读写外置存储的问题,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2021-12-12
  • Android 高仿QQ图片选择器

    Android 高仿QQ图片选择器

    这篇文章主要介绍了Android 高仿QQ图片选择器的实现思路,本文介绍的非常详细,具有参考借鉴价值,感兴趣的朋友一起看看吧
    2016-09-09
  • Android Studio 实现九宫格功能

    Android Studio 实现九宫格功能

    这篇文章主要介绍了Android Studio 实现九宫格,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • Android自定义view实现日历打卡签到

    Android自定义view实现日历打卡签到

    这篇文章主要为大家详细介绍了Android自定义view实现日历打卡签到,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • 为Android Studio编写自定义Gradle插件的教程

    为Android Studio编写自定义Gradle插件的教程

    这篇文章主要介绍了为Android Studio编写自定义Gradle插件的教程,Android Studio现在基本上已经成为了安卓开发的标配IDE,友可以参考下
    2016-02-02
  • 解决Android 沉浸式状态栏和华为虚拟按键冲突问题

    解决Android 沉浸式状态栏和华为虚拟按键冲突问题

    对于现在的 App 来说,布局页面基本都会用到沉浸式状态栏,单纯的沉浸式状态栏很容易解决,但是在华为手机上存在一个底部虚拟按键的问题,会导致页面底部和顶部出现很大的问题,下面通过本文给大家分享Android 沉浸式状态栏和华为虚拟按键冲突问题,一起看看吧
    2017-07-07
  • Android中常用的三个Dialog弹窗总结解析

    Android中常用的三个Dialog弹窗总结解析

    自己虽然一直使用过dialog,但是一直都是复制、粘贴;不清楚dialog的具体用途,这次趁着有时间,总结一下具体用法,感兴趣的朋友跟着小编来看看吧
    2021-10-10

最新评论