测试:

  • 测试的相关概念

1、根据是否知道源代码分类:

黑盒测试: a - b - c 边值测试 测试逻辑业务
白盒测试: 根据源代码写测试方法 或者 测试用例;

2、根据测试的粒度分类:

方法测试:写完一个方法后就测试
单元测试:测试一个能够独立运行的业务逻辑单元;
集成测试:整体测试项目 联调
系统测试:对整个系统进行测试

3、根据测试的暴力程度:

冒烟测试:高频次的点击软件
压力测试:使用测试工具:LoadRunner、Jmeter

单元测试Junit:

  • eclipse中的单元测试步骤:

1、写一个业务类,写一个业务方法:

public class CalcService {

  public static int add(int x,int y){

  return x+y;
}

}

2、写一个测试类,写一个测试方法,用来测试业务方法

public class CalcServiceTest extends AndroidTestCase{

  public void testAdd(){
    int result = CalcService.add(4, 5);
    assertEquals(9, result);//断言的作用:检测运行结果和预期是否一致
  }

}
3、在清单文件中添加测试需要的包

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.itheima.junit"
  android:versionCode="1"
  android:versionName="1.0" >

<!-- 添加指令集,添加到manifest节点的里面,指令集会把应用程序部署到模拟器上运行 -->

<instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="com.itheima.junit"></instrumentation>

<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >

<!-- 添加JUnit的测试包 ,添加到application节点的里面-->

<uses-library android:name="android.test.runner"/>

....
</application>

</manifest>

  • Android studio中单元测试步骤:(注意在AS中跟在eclipse中单元测试大有区别:省去了在清单文件中很多配置:指定指令集和要测试的应用包名,定义要使用的类库。因为AS内部集成了单元测试)

  1、创建一个业务类,一个业务方法

 package com.ahu.androidtest;

 /**
* Created by ahu_lichang on 2017/3/17.
*/ public class Utils {
public static int add(int i,int j){
return i+j;
}
}

  2、选中上面的业务类Utils,右键-->Go To  ---->Test---->新建测试类(勾选上下面方框中的方法)--->OK

  3、在生成的测试类UtilsTest中,边写自己想要的测试代码(背影部分代码是自己手动写的!)

 package com.ahu.androidtest;

 import org.junit.Test;

 import static org.junit.Assert.*;

 /**
* Created by ahu_lichang on 2017/3/17.
*/
public class UtilsTest {
@Test
public void add() throws Exception {
System.out.println("单元测试。。。");
int result = Utils.add(4,5);
assertEquals(9,result);//断言:检测预期的结果和运行的结果是否一致
} }

  4、最后右键测试类,运行这个类即可。

  5、运行结果

  • 把数据存储到文件

Android应用程序存储数据的方式:

1、保存到文件
2、SQLite数据库
3、内容提供者ContentProvider
4、sharedproferrences保存数据
5、网络

    /data/data/应用包名/info.txt

  • 从内存中读写文件(先把数据写入内存文件中,在从内存文件中读取数据并显示到界面上)

1、创建一个文件,目录data/data/<包名>/文件名(eclipse中和AS中的内存文件的存储目录一样)
2、创建一个文件输出流,把数据写到文件上
3、关闭输出流。

4、读取文件中的数据,并显示到界面上

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.ahu_lichang.myapplication.MainActivity"
android:orientation="vertical"
> <EditText
android:id="@+id/et_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入用户名"
/>
<EditText
android:id="@+id/et_pass"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textPassword"
android:hint="请输入密码"
/>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
>
<CheckBox
android:id="@+id/cb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="记住用户名和密码"
android:layout_centerVertical="true"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:text="登录"
android:layout_alignParentRight="true"
android:onClick="login"
/>
</RelativeLayout> </LinearLayout>
 package com.example.ahu_lichang.myapplication;

 import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast; import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
/**
* 在内存中读写文件中数据
*/
public class MainActivity extends AppCompatActivity {
private EditText et_name;
private EditText et_pass;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); et_name = (EditText) findViewById(R.id.et_name);
et_pass = (EditText) findViewById(R.id.et_pass); readAccount(); } /**
* 从内存文件中读取数据
*/
public void readAccount(){
File file = new File("data/data/com.example.ahu_lichang.myapplication/info.txt");//Tools->ADM->DDMS,在里面的文件浏览里能找到
if(file.exists()){
try {
FileInputStream fis = new FileInputStream(file);
//把字节流转换成字符流
BufferedReader br = new BufferedReader(new InputStreamReader(fis));
//读取txt文件里的用户名和密码
String text = br.readLine();
String[] s = text.split("##"); et_name.setText(s[0]);
et_pass.setText(s[1]);
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 先登录,将name和pass保存在内存中
*/
public void login(View v){ String name = et_name.getText().toString();
String pass = et_pass.getText().toString(); CheckBox cb = (CheckBox) findViewById(R.id.cb);
//判断选框是否被勾选
if(cb.isChecked()){
//data/data/com.ahu.androidtest:这就是内部存储空间的路径
File file = new File("data/data/com.example.ahu_lichang.myapplication/info.txt");
FileOutputStream fos;
try {
fos = new FileOutputStream(file);
fos.write((name + "##" + pass).getBytes());
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
} //创建并显示吐司对话框
Toast.makeText(this, "登录成功", 0).show();
}
}

读写SD卡中的文件(重点—Android studio实现

    注意:SD卡路径变化:

      • sdcard:2.3之前的
      • mnt/sdcard:4.3之前的
      • storage/sdcard:4.3之后的        

1、必须先要创建虚拟SD卡文件镜像,然后添加到AVD中(或者用命令让指定模拟器在启动时增加虚拟SD卡镜像文件)。

1)、在Android studio使用mksdcard命令创建SD卡镜像文件:

  adb shell

  mksdcard 64M D:\sdcard.img    -----在D:\目录下创建了一个64M大小的虚拟SD卡

2)、将SD卡镜像文件添加到模拟器中:

  第一种方式:直接在创建AVD的时候,就想已有的SD卡镜像文件添加到模拟器中

  第二种方式:使用命令让指定模拟器在启动时就添加SD卡镜像文件     emulator -avd AVD5.1 -sdcard D:\sdcard.img

  2、在SD卡上先写入文件,然后在读取里面的数据显示在界面上

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.ahu_lichang.myapplication.MainActivity"
android:orientation="vertical"
> <EditText
android:id="@+id/et_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入用户名"
/>
<EditText
android:id="@+id/et_pass"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textPassword"
android:hint="请输入密码"
/>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
>
<CheckBox
android:id="@+id/cb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="记住用户名和密码"
android:layout_centerVertical="true"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:text="登录"
android:layout_alignParentRight="true"
android:onClick="login"
/>
</RelativeLayout> </LinearLayout>
 package com.example.ahu_lichang.myapplication;

 import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast; import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
/**
* 在外部存储(SD卡)中读写文件中数据
*/
public class MainActivity extends AppCompatActivity {
private EditText et_name;
private EditText et_pass;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); et_name = (EditText) findViewById(R.id.et_name);
et_pass = (EditText) findViewById(R.id.et_pass); readAccount(); } /**
* 从SD卡文件中读取数据
*/
public void readAccount(){
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
File file = new File("storage/sdcard/info.txt");
if(file.exists()){
try {
FileInputStream fis = new FileInputStream(file);
//把字节流转换成字符流
BufferedReader br = new BufferedReader(new InputStreamReader(fis));
String text = br.readLine();
String[] s = text.split("##");
et_name.setText(s[0]);
et_pass.setText(s[1]);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
/**
* 先登录,将name和pass保存在SD卡中
*/
public void login(View v){ String name = et_name.getText().toString();
String pass = et_pass.getText().toString(); CheckBox cb = (CheckBox) findViewById(R.id.cb);
//判断选框是否被勾选
if(cb.isChecked()){
//MEDIA_UNKNOWN:不能识别sd卡
//MEDIA_REMOVED:没有sd卡
//MEDIA_UNMOUNTED:sd卡存在但是没有挂载
//MEDIA_CHECKING:sd卡正在准备
//MEDIA_MOUNTED:sd卡已经挂载,可用
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){//判断SD卡状态是否挂载
File file = new File(Environment.getExternalStorageDirectory(),"info.txt");//SD卡路径
FileOutputStream fos;
try {
fos = new FileOutputStream(file);
fos.write((name+"##"+pass).getBytes());
fos.close();
//创建并显示吐司对话框
Toast.makeText(this, "登录成功", 0).show();
} catch (Exception e) {
e.printStackTrace();
}
}else{
Toast.makeText(this, "SD卡不可用!!!",0).show();
}
}
}
}

  3、添加权限:(在Android studio中读写SD卡上文件要添加创建与删除文件权限、写入数据权限,不需要读权限。eclipse中则是要添加读权限、写权限)

     <!--在SD卡中创建与删除文件权限-->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!--向SD卡写入数据权限-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  • 获取SD的大小及可用空间
     /**
* 获取SD卡空间大小
*/
public void readSDSpace(){
//获取sd卡的目录对象
File file = Environment.getExternalStorageDirectory();
//获取sd卡的总的大小
Long total = file.getTotalSpace();
//获取sd卡剩余空间的大小
Long use = file.getUsableSpace();
//打开DDMS,可以在LogCat观察到
Log.e("总的大小:",total.toString());
Log.e("剩余空间:",use.toString());
//转换数据大小的数据单位
String totalSize = android.text.format.Formatter.formatFileSize(this,total);
String useSize = android.text.format.Formatter.formatFileSize(this,use);
Log.e("格式化后总的大小:",totalSize);
Log.e("格式化后剩余空间:",useSize);
}

  • 文件的权限概念

文件的4种操作模式:
Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中。可以使用Context.MODE_APPEND

Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件

Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件。

MODE_WORLD_READABLE:表示当前文件可以被其他应用读取;MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。

如果希望文件被其他应用读和写,可以传入:
openFileOutput("itcast.txt", Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE);

android有一套自己的安全模型,当应用程序(.apk)在安装时系统就会分配给他一个userid,当该应用要去访问其他资源比如文件的时候,就需要userid匹配。默认情况下,任何应用创建的文件,sharedpreferences,数据库都应该是私有的(位于/data/data/<package name>/files),其他程序无法访问。除非在创建时指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE ,只有这样其他程序才能正确访问。

  • SharedPreferences存储方式(重点)

    在SharedPreferences中文件读写数据:

 package com.example.ahu_lichang.myapplication;

 import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast; public class MainActivity extends AppCompatActivity {
private EditText et_name;
private EditText et_pass;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); et_name = (EditText) findViewById(R.id.et_name);
et_pass = (EditText) findViewById(R.id.et_pass); readAccount();
} public void readAccount(){
/**
* 从SharedPreferences中读取数据
*/
SharedPreferences sp = getSharedPreferences("config",MODE_PRIVATE);
String name = sp.getString("name","");
String pass = sp.getString("pass","");
et_name.setText(name);
et_pass.setText(pass);
} public void login(View v){ String name = et_name.getText().toString();
String pass = et_pass.getText().toString(); CheckBox cb = (CheckBox) findViewById(R.id.cb);
//判断选框是否被勾选
if(cb.isChecked()){
/**
* 向SharedPreferences中写入数据.路径在data/data/包名/share_prefs
*/
SharedPreferences sp = getSharedPreferences("config",MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.putString("name",name);//键值对形式
editor.putString("pass",pass);
editor.commit();
}
Toast.makeText(this,"登录成功",0).show();
}
}
  • 使用StringBuffer拼接字符串完成短信备份
 package com.ahu.lichang.androidtest;

 /**
* Created by ahu_lichang on 2017/3/18.
*/ public class Message {
private String body;
private String date;
private String address;
private String type;
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public Message(String body, String date, String address, String type) {
super();
this.body = body;
this.date = date;
this.address = address;
this.type = type;
}
}
 package com.ahu.lichang.androidtest;

 import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View; import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List; public class MainActivity extends AppCompatActivity {
List<Message> smsList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//虚拟10条短信
smsList = new ArrayList<Message>();
for(int i = 0; i < 10; i++){
Message sms = new Message("安徽大学" + i, System.currentTimeMillis() + "", "138"+i+i, "1");
smsList.add(sms);
}
}
//点击备份短信按钮
public void backup(View v){
//在内存中把xml备份短信的格式拼接出来
StringBuffer sb = new StringBuffer();
sb.append("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>");
sb.append("<messages>");
for (Message sms : smsList) {
sb.append("<sms>"); sb.append("<body>");
sb.append(sms.getBody());
sb.append("</body>"); sb.append("<date>");
sb.append(sms.getDate());
sb.append("</date>"); sb.append("<type>");
sb.append(sms.getType());
sb.append("</type>"); sb.append("<address>");
sb.append(sms.getAddress());
sb.append("</address>"); sb.append("</sms>");
}
sb.append("</messages>"); File file = new File("storage/sdcard/sms.xml");//要添加两个权限
try {
FileOutputStream fos = new FileOutputStream(file);
fos.write(sb.toString().getBytes());
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
  • 使用序列化器生成一个xml文件,完成短信备份
         //使用XmlSerializer序列化生成器完成短信备份
//使用xml序列化器生成xml文件
//1.拿到序列化器对象
XmlSerializer xs = Xml.newSerializer();
//2.初始化
File file = new File("sdcard/sms2.xml");
try {
FileOutputStream fos = new FileOutputStream(file);
//enconding:指定用什么编码生成xml文件
xs.setOutput(fos, "utf-8"); //3.开始生成xml文件
//enconding:指定头结点中的enconding属性的值
xs.startDocument("utf-8", true); xs.startTag(null, "message"); for (Message sms : smsList) {
xs.startTag(null, "sms"); xs.startTag(null, "body");
xs.text(sms.getBody());
xs.endTag(null, "body"); xs.startTag(null, "date");
xs.text(sms.getDate());
xs.endTag(null, "date"); xs.startTag(null, "type");
xs.text(sms.getType());
xs.endTag(null, "type"); xs.startTag(null, "address");
xs.text(sms.getAddress());
xs.endTag(null, "address"); xs.endTag(null, "sms");
} xs.endTag(null, "message"); //告诉序列化器,文件生成完毕
xs.endDocument();
} catch (Exception e) {
e.printStackTrace();
}

短信备份完成后,将SD卡中的xml文件pull出来,然后用浏览器打开该文件,就能很清晰的看见如下结果:

  • 使用pull解析xml格式的数据 (重要-AS实现)

    注意:1、Android studio和eclipse中的资源文件的存放位置不一样

        2、Android studio中获取资源文件的方法跟eclipse中不一样

  先在main目录下新建文件夹assets,然后再将资源文件weather.xml。

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<weather>
<city>
<name>上海</name>
<temp>5°</temp>
<pm>80</pm>
</city>
<city>
<name>北京</name>
<temp>-5°</temp>
<pm>800</pm>
</city>
<city>
<name>西安</name>
<temp>12°</temp>
<pm>60</pm>
</city>
</weather>

  编写要用到的javabean,City.java

 package com.ahu.lichang.pull;

 /**
* Created by ahu_lichang on 2017/3/18.
*/ public class City {
private String name;
private String temp;
private String pm;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTemp() {
return temp;
}
public void setTemp(String temp) {
this.temp = temp;
}
public String getPm() {
return pm;
}
public void setPm(String pm) {
this.pm = pm;
}
@Override
public String toString() {
return "City [name=" + name + ", temp=" + temp + ", pm=" + pm + "]";
}
}

  布局文件

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main"
android:layout_width="match_parent" android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.ahu.lichang.pull.MainActivity"
android:orientation="vertical"> <Button
android:text="pull解析"
android:onClick="pull"
android:layout_width="wrap_content"
android:layout_height="wrap_content" /> <TextView
android:id="@+id/tv_present"
android:text="显示出Pull解析出来的天气信息"
android:layout_width="match_parent"
android:layout_height="wrap_content" /> </LinearLayout>

  最后编写用XmlPullParser解析XML文件的具体代码

 package com.ahu.lichang.pull;

 import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Xml;
import android.view.View;
import android.widget.TextView; import org.xmlpull.v1.XmlPullParser; import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List; public class MainActivity extends AppCompatActivity {
private List<City> cityList;
private TextView tv_present;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_present = (TextView) findViewById(R.id.tv_present);
} public void pull(View v){
//获取到src文件夹下的资源文件,eclipse中这样实现
//InputStream is = getClassLoader().getResourceAsStream("weather.xml");
InputStream is = null;
try {
//在AS中,要在main下新建文件夹assets,然后将资源文件放进去
is = this.getApplicationContext().getAssets().open("weather.xml");
} catch (IOException e) {
e.printStackTrace();
}
//拿到pull解析器对象
XmlPullParser xp = Xml.newPullParser();
//初始化
try {
xp.setInput(is, "utf-8");
//获取当前节点的事件类型,通过事件类型的判断,我们可以知道当前节点是什么节点,从而确定我们应该做什么操作
int type = xp.getEventType();
City city = null;
while(type != XmlPullParser.END_DOCUMENT){
//根据节点的类型,要做不同的操作
switch (type) {
case XmlPullParser.START_TAG:
//获取当前节点的名字
if("weather".equals(xp.getName())){
//创建city集合对象,用于存放city的javabean
cityList = new ArrayList<City>();
}
else if("city".equals(xp.getName())){
//创建city的javabean对象
city = new City();
}
else if("name".equals(xp.getName())){
//获取当前节点的下一个节点的文本
String name = xp.nextText();
city.setName(name);
}
else if("temp".equals(xp.getName())){
//获取当前节点的下一个节点的文本
String temp = xp.nextText();
city.setTemp(temp);
}
else if("pm".equals(xp.getName())){
//获取当前节点的下一个节点的文本
String pm = xp.nextText();
city.setPm(pm);
}
break;
case XmlPullParser.END_TAG:
if("city".equals(xp.getName())){
//把city的javabean放入集合中
cityList.add(city);
}
break;
}
//把指针移动到下一个节点,并返回该节点的事件类型
type = xp.next();
}
is.close();
StringBuffer sb = new StringBuffer();
for (City c : cityList) {
System.out.println(c.toString());
sb.append(c.toString());
sb.append("\n");
}
tv_present.setText(sb.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
}

  运行结果

单元测试+内存、SD卡、SP读写+XmlPullParser的更多相关文章

  1. 【译】如何在 Android 5.0 上获取 SD卡 的读写权限

    因为最近项目需要,涉及到 SD卡 的读写操作,然而申请 <!-- 读写权限 --> <uses-permission android:name="android.permi ...

  2. SD卡spi读写流程

    SD卡spi读写流程 1.SD卡的命令格式: SD卡的指令由6字节(Byte)组成,如下: Byte1:0 1 x x x x x x(命令号,由指令标志定义,如CMD39为100111即16进制0x ...

  3. 快速解决设置Android 23.0以上版本对SD卡的读写权限无效的问题

    快速解决设置Android 23.0以上版本对SD卡的读写权限无效的问题 转 https://www.jb51.net/article/144939.htm 今天小编就为大家分享一篇快速解决设置And ...

  4. 基础学习总结(三)--文本、SD卡数据读写

    简单的文本数据写入文件不需要权限,读写SD卡在4.0版本前需要写权限.在4.0后需要读写权限 布局: <LinearLayout xmlns:android="http://schem ...

  5. 使用STM32F103ZET霸道主板实现SD卡的读写(非文件系统)

    了解STM32F103ZET是高容量多管脚的芯片 了解SD读写线路图 了解SD的基地址 阅读STM32F10xx英文参考 SDIO那章,我们编写代码边看文档解析 建工程,打开包含所有包括外设库函数的样 ...

  6. 解决SD卡频繁读写问题 Anything-sync-daemon 映射linux目录到tmpfs并定时同步

    Anything-sync-daemon (asd) is a is a diminutive pseudo-daemon designed to manage target directories ...

  7. Android入门开发之SD卡读写操作(转)

    SD卡的读写是我们在开发android 应用程序过程中最常见的操作.下面介绍SD卡的读写操作方式: 1. 获取SD卡的根目录 String  sdCardRoot = Environment.getE ...

  8. Android读写SD卡

    SD卡的读写是我们在开发Android 应用程序过程中最常见的操作.下面介绍SD卡的读写操作方式: 1. 获取SD卡的根目录 String sdCardRoot = Environment.getEx ...

  9. android 读写sd卡的权限设置

    原文:android 读写sd卡的权限设置 在Android中,要模拟SD卡,要首先使用adb的mksdcard命令来建立SD卡的镜像,如何建立,大家上网查一下吧,应该很容易找到,这里不说这个问题. ...

随机推荐

  1. SQL Server 属性不匹配。存在属性(Directory, Archive),包括属性(0),不包括属性(Archive, Compressed, Encrypted)

    问题:安装SQL SERVER 2008报错 “存在属性(Directory, Archive),包括属性(0),不包括属性(Archive, Compressed, Encrypted)” 解决办法 ...

  2. bzoj千题计划130:bzoj1305: [CQOI2009]dance跳舞

    http://www.lydsy.com/JudgeOnline/problem.php?id=1305 每个人拆为喜欢(yes)和不喜欢(no)两个点 二分答案 1.每两个人之间只能跳一次 喜欢则 ...

  3. 2017 清北济南考前刷题Day 7 morning

    期望得分:100+50+20=170 实际得分:10+50+20=80 1. 纸牌 题目描述 在桌面上放着n张纸牌,每张纸牌有两面,每面都写着一个非负整数.你的邪王真眼可以看到所有牌朝上的一面和朝下的 ...

  4. 八卦Minsky打压神经网络始末

    八卦Minsky打压神经网络始末 谈下Minsky造成的神经网络冰河事件:57年一个叫弗兰克的大概只有二流水平的学者搞出了感知机,理论和实践证明了对线性可分问题的有效性,引起一阵轰动,特别是非科学圈类 ...

  5. python学习笔记3-函数的递归

    递归就是指自己函数的自我调用 #递归 #自己调用自己,函数的循环 def test1(): num = int(input('please enter a number:')) if num%2==0 ...

  6. 微服务深入浅出(1)-- SpringBoot

    基于Spring的开发框架,旨在简化配置快速开发,是新一代web开发框架.下面介绍一下常用的几个功能: 1.Spring单元测试 针对DAO层 (1) @RunWith(Spring.class),表 ...

  7. Tomcat与Spring中的事件机制详解

    最近在看tomcat源码,源码中出现了大量事件消息,可以说整个tomcat的启动流程都可以通过事件派发机制串起来,研究透了tomcat的各种事件消息,基本上对tomcat的启动流程也就有了一个整体的认 ...

  8. 【leetcode 简单】 第一百一十二题 重复的子字符串

    给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成.给定的字符串只含有小写英文字母,并且长度不超过10000. 示例 1: 输入: "abab" 输出: True 解释 ...

  9. reshape中的-1

    >>> a = np.array([[1,2,3], [4,5,6]]) >>> np.reshape(a, (3,-1)) # the unspecified v ...

  10. Ubuntu_安装Wiz笔记

    前言 安装完成了Linux,有了搜狗输入法,我们还需要笔记软件,本文主要介绍如何安装为知笔记 安装步骤 找到wiz官网:http://www.wiz.cn/ 获取Linux安装教程 安装QT 下载的Q ...