十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
@Override
创新互联自2013年起,先为潢川等服务建站,潢川等地企业,进行企业商务咨询服务。为潢川企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。
public void onClick(View view) {
String state = Environment.getExternalStorageState();//获取外部设备状态
//检测外部设备是否可用
if(!state.equals(Environment.MEDIA_MOUNTED)) {
Toast.makeText(this, "外部设备不可用", Toast.LENGTH_SHORT).show();
return;
}
//创建文件
File sdCard = Environment.getExternalStorageDirectory();//获取外部设备的目录
File file = new File(sdCard,"文件名.txt");//文件位置
try {
FileOutputStream outputStream = new FileOutputStream(file);//打开文件输出流
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream));//写入到缓存流
writer.write("这里是要写入到文件的数据");//从从缓存流写入
writer.close();//关闭流
Toast.makeText(this, "输出成功", Toast.LENGTH_SHORT).show();
}
catch(Exception exception) {
Toast.makeText(this, "输出失败", Toast.LENGTH_SHORT).show();
}
}
写入到文件管理时需要权限
uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/
建立AIDL服务要比建立普通的服务复杂一些,具体步骤如下:
(1)在Eclipse Android工程的Java包目录中建立一个扩展名为aidl的文件。该文件的语法类似于Java代码,但会稍有不同。详细介绍见实例52的内容。
(2)如果aidl文件的内容是正确的,ADT会自动生成一个Java接口文件(*.java)。
(3)建立一个服务类(Service的子类)。
(4)实现由aidl文件生成的Java接口。
(5)在AndroidManifest.xml文件中配置AIDL服务,尤其要注意的是,action标签中android:name的属性值就是客户端要引用该服务的ID,也就是Intent类的参数值。
建立AIDL服务
本例中将建立一个简单的AIDL服务。这个AIDL服务只有一个getValue方法,该方法返回一个String类型的值。在安装完服务后,会在客户端调用这个getValue方法,并将返回值在TextView组件中输出。建立这个AIDL服务的步骤如下:
(1)建立一个aidl文件。在Java包目录中建立一个IMyService.aidl文件。IMyService.aidl文件的位置如图
IMyService.aidl文件的内容如下:
Java代码:
package eoe.demo;
interface IMyService {
String getValue();
}
IMyService.aidl文件的内容与Java代码非常相似,但要注意,不能加修饰符(例如,public、private)、AIDL服务不支持的数据类型(例如,InputStream、OutputStream)等内容。
(2)如果IMyService.aidl文件中的内容输入正确,ADT会自动生成一个IMyService.java文件。读者一般并不需要关心这个文件的具体内容,也不需要维护这个文件。关于该文件的具体内容,读者可以查看本节提供的源代码。
(3)编写一个MyService类。MyService是Service的子类,在MyService类中定义了一个内嵌类(MyServiceImpl),该类是IMyService.Stub的子类。MyService类的代码如下:
Java代码:
package eoe.demo;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
public class MyService extends Service {
public class MyServiceImpl extends IMyService.Stub {
@Override
public String getValue() throws RemoteException {
return "Android/OPhone开发讲义";
}
}
@Override
public IBinder onBind(Intent intent) {
return new MyServiceImpl();
}
}
在编写上面代码时要注意如下两点:
IMyService.Stub是根据IMyService.aidl文件自动生成的,一般并不需要管这个类的内容,只需要编写一个继承于IMyService.Stub类的子类(MyServiceImpl类)即可。
onBind方法必须返回MyServiceImpl类的对象实例,否则客户端无法获得服务对象。
(4)在AndroidManifest.xml文件中配置MyService类,代码如下:
Java代码:
service android:name=".MyService"
intent-filter
action android:name="net.blogjava.mobile.aidl.IMyService" /
/intent-filter
/service
下面来编写客户端的调用代码。首先新建一个Eclipse Android工程(ch08_aidlclient),并将自动生成的IMyService.java文件连同包目录一起复制到ch08_aidlclient工程的src目录中,如图所示。
调用AIDL服务首先要绑定服务,然后才能获得服务对象,代码如下:
Java代码:
package net.blogjava.mobile;
import net.blogjava.mobile.aidl.IMyService;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle; import android.os.IBinder;
import android.view.View; import android.view.View.OnClickListener;
import android.widget.Button; import android.widget.TextView;
public class Main extends Activity implements OnClickListener {
private IMyService myService = null;
private Button btnInvokeAIDLService;
private Button btnBindAIDLService;
private TextView textView;
private ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// 获得服务对象
myService = IMyService.Stub.asInterface(service);
btnInvokeAIDLService.setEnabled(true);
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.btnBindAIDLService:
// 绑定AIDL服务
bindService(new Intent("net.blogjava.mobile.aidl.IMyService"), serviceConnection, Context.BIND_AUTO_CREATE);
break;
case R.id.btnInvokeAIDLService:
try {
textView.setText(myService.getValue());
// 调用服务端的getValue方法
} catch (Exception e) {
}
break;
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btnInvokeAIDLService = (Button) findViewById(R.id.btnInvokeAIDLService);
btnBindAIDLService = (Button) findViewById(R.id.btnBindAIDLService); btnInvokeAIDLService.setEnabled(false);
textView = (TextView) findViewById(R.id.textview);
btnInvokeAIDLService.setOnClickListener(this);
btnBindAIDLService.setOnClickListener(this);
}。
!--往sdcard中写入数据的权限 --uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/uses-permission!--在sdcard中创建/删除文件的权限 --uses-permission android:name="android.permission.MOUNT_U
android中的apk必须签名
这种签名不是基于权威证书的,不会决定某个应用允不允许安装,而是一种自签名证书。
重要的是,android系统有的权限是基于签名的。比如:system等级的权限有专门对应的签名,签名不对,权限也就获取不到。默认生成的APK文件是debug签名的。
获取system权限时用到的签名,见:如何使Android应用程序获取系统权限。基于UserID的进程级别的安全机。这种签名不是基于权威证书的,不会决定某个应用允不允许安装,而是一种自签名证书。重要的是,android系统有的权限是基于签名的。
Android手机下可以写文件的目录除了
Environment.getExternalStorageDirectory()获取的路径也就是/sdcard
/data/data/packageName/安装包路径下
像/storage/sdcard0, /mnt/sdcard 都是软链接到 /sdcard
一般非root手机来说都有内置sdcard 这个肯定可以写的,如果有外置sdcard这个也是可以的,再就是你应用安装目录下的这都是可以的。root后的我就不多说了。还有个/data/local/tmp
android10删除文件后写文件如下
1.将数据存储到文件中(文件默认存储到data/data/包名/files目录下)htmlpublic void save(String inputText) {//inputText为传入的要保存的数据FileOutputStream out = null;BufferedWriter writer = null;try {= openFileOutput("data", Context.MODE_APPEND);//"data"为文件名,第二个参数为文件操做模式:文件已经存在,就往文件里面追加类容,不重新建立文件。
writer = new BufferedWriter(new OutputStreamWriter(out));writer.write(inputText);} catch (IOException e) {e.printStackTrace();} finally {try {if (writer != null) {writer.close();
2.从文件中读取数据android//读取数据= load();if (!TextUtils.isEmpty(inputText1)) {//非空判断,传入为null和空字符串时返回true//将数据展现到listview控件 );//android.R.layout.simple_list_item_1android内置子布adapter.add(inputText1);ListViewBattery5.setAdapter(adapter)。
IO流(操作文件内容): 字节流
参考:
AssetManager
assets 文件夹用于存储应用需要的文件,在安装后可直接从其中读取使用或者写入本地存储中
Android Studio 默认不建立该文件夹,可以手动新建 : app - src - main - assets
或者,右键 main - New - Folder - Assets Folder
AssetManager 对象可以直接访问该文件夹:
获取方法:
使用函数 open 可以打开 assets 文件夹中对象,返回一个 InputStream 对象:
open
获取方法: