Android SD卡检测和SP数据保存不及时解决方案
Posted 单灿灿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android SD卡检测和SP数据保存不及时解决方案相关的知识,希望对你有一定的参考价值。
这个星期在改下载的Demo与TV移动飞框框架,所以时间比较紧。估计一周后会开源这两个框架,今天先来一个技术含量不高的SD卡的检测与判断和Sp数据保存遇到问题与解决方案。
这篇文章的SD卡检测的情况包含的比较多,你也可以利用相近的方法,来判断是否是U盘的插拔(主要是针对TV,核心方法可以利用到手机)。
比较难的就是在SD卡插拔的时候判断是否是SD卡,因为U盘插拔的广播和内存卡是一样的。
废话不多说,上代码。
SD卡的检查与监测
public class SdcardActivity extends AppCompatActivity
BroadcastReceiver mRefresh;
TextView mTextView;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
registerRefreshBroadcast();
mTextView = (TextView) findViewById(R.id.textsdcrd);
// /mnt/external_sd /mnt/shell/emulated
if (getPath().equals("/mnt/external_sd"))
mTextView.setText("SD卡: 已挂载");
else
mTextView.setText("SD卡: 未挂载");
@SuppressLint("SdCardPath")
public String getPath()
String sdcard_path = null;
String sd_default = Environment.getExternalStorageDirectory()
.getAbsolutePath();
Log.d("text", sd_default);
if (sd_default.endsWith("/"))
sd_default = sd_default.substring(0, sd_default.length() - 1);
// 得到路径
try
Runtime runtime = Runtime.getRuntime();
Process proc = runtime.exec("mount");
InputStream is = proc.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
String line;
BufferedReader br = new BufferedReader(isr);
while ((line = br.readLine()) != null)
if (line.contains("secure"))
continue;
if (line.contains("asec"))
continue;
if (line.contains("fat") && line.contains("/mnt/"))
String columns[] = line.split(" ");
if (columns != null && columns.length > 1)
if (sd_default.trim().equals(columns[1].trim()))
continue;
sdcard_path = columns[1];
else if (line.contains("fuse") && line.contains("/mnt/"))
String columns[] = line.split(" ");
if (columns != null && columns.length > 1)
if (sd_default.trim().equals(columns[1].trim()))
continue;
sdcard_path = columns[1];
catch (Exception e)
// TODO Auto-generated catch block
e.printStackTrace();
Log.d("text", sdcard_path);
return sdcard_path;
public void registerRefreshBroadcast()
IntentFilter mFilter = new IntentFilter();
mFilter.addAction(Intent.ACTION_MEDIA_EJECT); //移除
mFilter.addAction(Intent.ACTION_MEDIA_MOUNTED);//挂载
mFilter.addDataScheme("file");
mRefresh = new BroadcastReceiver()
public void onReceive(Context context, Intent intent)
String action = intent.getAction();
if (action.equals(Intent.ACTION_MEDIA_MOUNTED)) //补丁广播
Log.e("localProduct7", "intent.getData().getPath() 139 ;" + intent.getData().getPath());
if (intent.getData().getPath().equals("/mnt/external_sd"))
mTextView.setText("SD卡: 已挂载");
else if (action.equals(Intent.ACTION_MEDIA_EJECT))
if (intent.getData().getPath().equals("/mnt/external_sd"))
mTextView.setText("SD卡: 未挂载");
;
registerReceiver(mRefresh, mFilter);
上面就是我们读取SD卡以及检测SD卡的状态的代码。
SP数据保存不及时与解决方案
很多时候我们的SP数据并不能及时的得到保存,尤其在遇到断电等其他突发情况。那么我就来给大家提一个技巧吧。
/*
* sp工具类,赶快写好处理
*/
public class SPUtils
public SPUtils()
/* cannot be instantiated */
/**
* 保存在手机里面的文件名
*/
public static final String FILE_NAME = "shancancan";
/**
* 保存数据的方法,我们需要拿到保存数据的具体类型,然后根据类型调用不同的保存方法
*
* @param context
* @param key
* @param object
*/
public static void put(Context context, String key, Object object)
SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
if (object instanceof String)
editor.putString(key, (String) object);
else if (object instanceof Integer)
editor.putInt(key, (Integer) object);
else if (object instanceof Boolean)
editor.putBoolean(key, (Boolean) object);
else if (object instanceof Float)
editor.putFloat(key, (Float) object);
else if (object instanceof Long)
editor.putLong(key, (Long) object);
else
editor.putString(key, object.toString());
SharedPreferencesCompat.apply(editor);
/**
* 得到保存数据的方法,我们根据默认值得到保存的数据的具体类型,然后调用相对于的方法获取值
*
* @param context
* @param key
* @param defaultObject
* @return
*/
public static Object get(Context context, String key, Object defaultObject)
SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
Context.MODE_PRIVATE);
if (defaultObject instanceof String)
return sp.getString(key, (String) defaultObject);
else if (defaultObject instanceof Integer)
return sp.getInt(key, (Integer) defaultObject);
else if (defaultObject instanceof Boolean)
return sp.getBoolean(key, (Boolean) defaultObject);
else if (defaultObject instanceof Float)
return sp.getFloat(key, (Float) defaultObject);
else if (defaultObject instanceof Long)
return sp.getLong(key, (Long) defaultObject);
return null;
/**
* 移除某个key值已经对应的值
*
* @param context
* @param key
*/
public static void remove(Context context, String key)
SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.remove(key);
SharedPreferencesCompat.apply(editor);
/**
* 清除所有数据
*
* @param context
*/
public static void clear(Context context)
SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.clear();
SharedPreferencesCompat.apply(editor);
/**
* 查询某个key是否已经存在
*
* @param context
* @param key
* @return
*/
public static boolean contains(Context context, String key)
SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
Context.MODE_PRIVATE);
return sp.contains(key);
/**
* 返回所有的键值对
*
* @param context
* @return
*/
public static Map<String, ?> getAll(Context context)
SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
Context.MODE_PRIVATE);
return sp.getAll();
/**
* 创建一个解决SharedPreferencesCompat.apply方法的一个兼容类
*
* @author changmingshan
*/
private static class SharedPreferencesCompat
private static final Method sApplyMethod = findApplyMethod();
/**
* 反射查找apply的方法
*
* @return
*/
@SuppressWarnings("unchecked", "rawtypes")
private static Method findApplyMethod()
try
Class clz = SharedPreferences.Editor.class;
return clz.getMethod("apply");
catch (NoSuchMethodException e)
return null;
/**
* 如果找到则使用apply执行,否则使用commit
*
* @param editor
*/
public static void apply(SharedPreferences.Editor editor)
try
if (sApplyMethod != null)
sApplyMethod.invoke(editor);
return;
catch (IllegalArgumentException e)
catch (IllegalAccessException e)
catch (InvocationTargetException e)
editor.commit();
try
Runtime.getRuntime().exec("sync");
catch (IOException e)
e.printStackTrace();
我这里面是封装了apply方法,apply涉及到sp的数据修改,在修改后一定要加:
try
Runtime.getRuntime().exec("sync");
catch (IOException e)
e.printStackTrace();
这句代码非常重要,可以及时保存你的数据!这句话的意思和adb shell sync的意思是一样的。
以上是关于Android SD卡检测和SP数据保存不及时解决方案的主要内容,如果未能解决你的问题,请参考以下文章