位置: 编程技术 - 正文

安卓下的分件分享——FileProvider(安卓下的分件分享怎么弄)

编辑:rootadmin
分享文件

推荐整理分享安卓下的分件分享——FileProvider(安卓下的分件分享怎么弄),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:安卓下的分件分享怎么弄,安卓app分发,安卓app分成,安卓app分发,安卓下的分件分享怎么用,安卓下的分件分享怎么用,安卓下的分件分享怎么用,安卓下的分件分享怎么弄,内容如对您有帮助,希望把文章链接给更多的朋友!

△概述:如果你要对外提供少量数据,你可以用Intent带着少量数据出去,当你需要对外提供大批量的数据(比如一个图片编辑软件向你请求一个图片资源,一个文档编辑器向你请求一个文档)你将需要分享文件。

△客户端与服务器:我们将请求文件的应用称为客户端,将对外提供数据的应用称为服务器。

服务器

△概述:

→这里所谓的服务器,就是一个能够将自己的文件分享出去的应用程序。

→文件是通过URL形式分享,通过文件的URL分享文件是安全的

→FileProvider组件提供方法:getUriForFile()为一个文件生成content URL。

△为了完成服务器的工作,你需要做如下事情:

→配置FileProvider,这个组件提供方法将文件以URL的形式分享出去。

→设置一个文件展示以及选择用的窗体,当其他的应用请求访问一些文件,如果你的应用包含这些文件,你需要将这些文件展现在窗体上以供用户选择。

→当用户选择了某个文件之后,你还要能响应用户选择(其实就是将用户选择的文件以URl形式,返回 给请求文件的那个应用)。

定义FileProvider

△想将文件分享出去,首先需要定义一个文件分享者:FileProvider,步骤如下:在配置文件里面增加一个字段<provider></provider>,这个字段需要指定如下信息:

→指定FileProvider的类。

→你的文件的URl的“authority”属性。

→一个xml文件,你的应用只能将指定的某些路径下的文件分享出去,这些路径由你通过这个XML文件指定。

注:→authority属性的内容应该是:包名.fileprovider

→xml文件由meta-data子元素来指定。

<provider

<!--指定fileProvider-->

android:name="android.support.v4.content.FileProvider"

<!--指定authroity属性&#;-->

android:authorities="com.test.fileprovider.fileprovider"

<!--允许授权-->

android:grantUriPermissions="true"

android:exported="false">

<meta-data

android:name="android.support.FILE_PROVIDER_PATHS"

<!--指定xml文件的路径-->

android:resource="@xml/filepaths"/>

</provider>

△创建上一步所说的XML文件

→在res目录下面新建文件夹,取名xml,在文件夹新建一个文件,取名:filepaths,

这是按照上图当中resource内容创建。

→xml文件内容:

<?xml version="1.0" encoding="utf-8"?>

<paths>

<!—path表示你要分享哪个路径下的文件-->

<files-path path="images/" name="myimages"/>

</paths>

解析:

→到此为止,你已经拥有了一个完整的FileProvider。他配置了authority,你想要分享的文件所在路径 (或者说是你的应用程序能够分享出去的文件的路径)。

→现在,xml文件指定了如下路径:/data/data/包名/files/images。其实就是你的应用调用方法: getFilesDir()所返回的路径下的images子路径:files/images/。

→name属性内容与文件的路径没有关系,他是你想要在你的URL里面插入的一个字段,如果你在 files/images/路径下面有个文件名叫:myImage.jpg。那么fileprovider将会返回:

包含images子路径名,而且包含了一个你想插入的name。name属性其实就是为了隐藏真实的路径 的。

→所以最终URL是: 你的文件的全名。

→注:在<paths></paths>标签里面你还可以添加多个元素:<cache-path>(对应路径:/data/data/包 名/cache)或者<external-path>(对应你的应用程序在SD卡上的默认路径)。

设置一个文件展示以及选择用的窗体

△当你配置了FileProvider,且当有应用向你请求文件时,你需提供一个窗体,该窗体能实现如下功能:

→可以被请求文件的应用唤起(就是能被隐式Intent唤起)。

→将自己能够分享的文件显示在窗体里(你可以用ListView实现,安卓官方教程也以这个控件作为例子实现)。

→当用户点击了某个文件,该窗体能提供这个文件的URL(就是将URL返回给调用他的窗体)。

△通过配置清单文件的过滤器实现第一步

<intent-filter>

<!--你需要将action设置为:android.intent.ACTION_PICK,除了默认category,还要添加一个叫做:android.intent.CATEGORY.OPENABLE-->

<action android:name=”android.intent.ACTION_PICK”/>

<category android:name=”android.intent.CATEGORY_DEFAULT”/>

<category android:name=”android.intent.CATEGROY.OPENABLE”/>

<!—还要设置你能够分享的数据类型-->

<!—实际开发中你应该根据实际情况设置-->

<data mimeType=”text/plain” />

<data mimeType=”image/*”>

</intent-filter>

△通过设置ListView实现第二步(我的代码将分享的路径:手机内存/files/images/,至于如何在内存里创建一个images文件夹,我在这里不再重复)

public classFileSelectActivityextendsActivity {

//他将指向内存路径

private FilemyFilesDi;

//指向images子路径的

private FilemyImageDir;

//images子路径的所有文件

privateFile[] myImageFiles;

//images子路径的所有文件名字

privateString[] myImageFilenames;

//用ListView展示文件给用户

private ListView mFileListView = null;

private Uri fileUri =null;

Intent mResultIntent =null;

@Override

protected voidonCreate(Bundle savedInstanceState) {

//TODOAuto-generated method stub

super.onCreate(savedInstanceState);

setContentView(R.layout.file_select_activity);

//先将成员变量给实例化

myFilesDir = getFilesDir();

myImageDir = new File(myFilesDir,”images”);

myImageFiles = myImageDir.listFiles();

//将文件的名字装进数组里面

for(int i = 0; i<myImageFiles.length; i&#;&#;)

{

myImageFilenames[i] = myImageFiles[i].getName();

}

安卓下的分件分享——FileProvider(安卓下的分件分享怎么弄)

//根据ID的到控件

mFileListView =(ListView)findViewById(R.id.lv_file);

//设置Intent

mResultIntent = new Intent("com.test.fileprovider.ACTION_RETURN_FILE");

newIntent("com.test.fileprovider.ACTION_RETURN_FILE");

//为ListView添加适配器

mFileListView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,myImageFileNames);

android.R.layout.simple_list_item_1, myImageFilenames));

/*到这一步你的路径下的文件已经可以显示出来,我的例程只是显示图片文件的文件名*/

/*接下来要进行如下工作:当有用户点击你的某个文件,你要获取该文件URL,并且将该URL返回给启用你的那个应用*/

//设置点击事件响应函数

mFileListView.setOnItemClickListener(new AdapterView.OnItemClickListener(){

@Override

public void onItemClick(AdapterView<?> parent, View view,int position, long id){

// TODOAuto-generated method stub

//获取被点击的那个文件

FilerequestFile = new File(myImageDir,myImageFilenames[position]);

try {

//获取文件的URL

fileUri=

FileProvider.getUriForFile(FileSelectActivity.this, "com.test.fileprovider.fileprovider",requestFile);

} catch(Exception e) {

//TODO:handle exception

//打印出现的错误的信息

Toast.makeText(FileSelectActivity.this,e&#;"",Toast.LENGTH_SHORT).show();

}

//如果成功获取了URL

if (fileUri!=null) {

//为URI添加访问权限mResultIntent.addFlags(

Intent.FLAG_GRANT_READ_URI_PERMISSION);

//为Intent设置返回的数据

mResultIntent.setDataAndType(fileUri, getContentResolver().getType(fileUri));

//设置成功返回标志

FileSelectActivity.this.setResult(RESULT_OK, mResultIntent);

}

//如果没有获取文件的URL,也要设置相关信息

else {

mResultIntent.setDataAndType(null, "");

FileSelectActivity.this.setResult(RESULT_CANCELED, mResultIntent);

}

}//onItemClick方法体

});

}

/*程序到此,你已经根据用户的选择获取文件的URL,而且设置了返回的intent,不过千万别忘记了还有一步,你得设置一个返回按钮,在里面调用结束的方法,将你这个应用窗体结束:finish();这样才能将所有的数据返回客户端的应用*/

客户端

△概述:客户端即请求获取某些文件的应用程序。

△客户端要做些什么:

→配置Intent,指定客户端想请求访问什么文件

(1) intent.setAction(Intent.ACTION_PICK);

(2) intent.setType(“image/*”);

→启动访问:当用户想访问某些文件,一般情况下,应当是在某个按钮点击事件响应函数里面执行:执行方法: startActivityForResult(intent,0);

→当服务器提供了想要的文件,客户端要处理自己所得到的文件。

复写:onActivityResult(int requestCode, int resultCode, Intent returnIntent);

方法里面,returnIntent参数,他带着从服务器里返回来的文件URL,通过他来打开我们想访问的文件

△配置Intent

public classMainActivityextendsActivity {

private Intent myRequestIntent = null;

private ParcelFileDescriptor mInputPFD = null;

//待会利用一个控件显示我们所得到的URL

privateTextViewtv = null;

@Override

protected voidonCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

//配置Intent

myRequestIntent =newIntent(Intent.ACTION_PICK);

myRequestIntent.setType("image/jpg");

tv =(TextView)findViewById(R.id.tv_info);

}

}

△启动访问

//点击事件响应函数

public void requestFiles(View view){

//启动服务端的程序

startActivityForResult(myRequestIntent, 0);

}

//客户端通过URl处理所得到的文件

@Override

protected void onActivityResult(intrequestCode,intresultCode, Intent returnIntent) {

//TODOAuto-generated method stub

super.onActivityResult(requestCode,resultCode, returnIntent);

//如果没有得到数据直接返回当前函数

if(resultCode!=RESULT_OK) {

return;

//如果成功得到数据

}else {

Uri returnUri = returnIntent.getData();

tv.setText(returnUri&#;"");//通过控件显示文件的URl

try {

mInputPFD =getContentResolver().openFileDescriptor(returnUri, "r");

} catch(FileNotFoundException e) {

//TODO:handle exception

e.printStackTrace();

return;

}

FileDescriptorfd = mInputPFD.getFileDescriptor();

//fd是个流对象你可以通过它去得到文件

}//if

}

/*

到此为止你已经得到了一个客户端的程序

*/

分析Button的android:layout_marginBottom参数失效问题 重现bug:发现在每次点击Button之后,android:layout_marginBottom参数失效。分析Button点击事件,并没有对这个参数做调整,而且,Java代码也不能对这个参数做

安卓icon应用图标不能显示的可能问题 前几天写一个安卓小应用程序,在icon应用图标上我找了半天才找到一个比较满意的图片,但是部署到模拟器上图标却是安卓系统图标。我以为是模拟器

菜鸟的安卓实习之路---布局 1layout_gravity和gravitylayout_gravity说的是自身在父布局当中的gravity,而gravity说的是内部空间的gravity2RelativeLayout的布局orientation这种layout当中必须指定每一个

标签: 安卓下的分件分享怎么弄

本文链接地址:https://www.jiuchutong.com/biancheng/374576.html 转载请保留说明!

上一篇:Android项目的目录结构(一个android项目一般包含哪些目录?各有什么用途?)

下一篇:分析Button的android:layout_marginBottom参数失效问题(button按钮类型)

  • 营业现金比率是用经营活动净流入还是经营活动流入
  • 递延所得税资产和负债怎么理解
  • 销售利税率计算公式及分析
  • 租赁费税率3%
  • 外币收入的增值税是多少
  • 建筑业资源税如何缴纳
  • 企业有利润要交什么税
  • 应收账款和应付账款的区别
  • 普通增值税发票是否可以抵扣?
  • 支付单位结算卡年费计入什么科目
  • 超市预付款应做在哪个会计科目?
  • 购进固定资产汽车该如何进行会计处理?
  • 叉车在固定资产里叫什么
  • 货运代理可以开9个点的发票吗?
  • 海关进口增值税怎么认证抵扣
  • 小微企业季度超过45万如何填申报表
  • 解析居民企业非货币性资产对外投资政策
  • 延期付款利息到底有没有税务风险
  • 企业捐赠现金支出应在哪个项目反应
  • 维修车间人员的工作总结
  • 杜邦分析法的三个核心是什么
  • 高速公路过路费税率是多少
  • 外贸出口企业的租金能退税吗
  • 路由器ip分配数量
  • 以前年度的其他应付款不用付怎么处理
  • 车站计算机系统组成
  • php session实例
  • 增值税一般纳税人和小规模纳税人的区别
  • linux添加系统用户命令
  • 一公顷等于多少千米
  • php读取json数组中指定内容
  • 季度报表本期金额和累计金额
  • thinkphp 模块
  • php中的九大缓存技术
  • vuex中this.$store.commit和this.$store.dispatch的用法
  • html零基础入门教程
  • 【小沐学C++】C++ MFC中嵌入web网页控件(WebBrowser、WebView2、CEF3)
  • Attentional Feature Fusion 注意力特征融合
  • 结转损益的凭证需要打印吗
  • 丧葬补贴金和抚恤金怎样领取
  • 跨年发票可以作为税前扣除的时限
  • 周转材料二级科目有哪些
  • 企业收到的国外发票可以入账吗
  • 事务所的账务处理
  • 2021年废铁回收
  • 企业找审计是为了什么
  • 社区居委会有哪些成员
  • 安全基金提取会计分录
  • 发票冲红重开摘要如何写合适?
  • 政府补贴资金如何记账
  • 专项应付款二级科目
  • 冲回去年收入会计分录
  • 结转成本附什么附件
  • 暂估入库产品销售结转成本
  • 税收优惠应计入那个科目
  • 年末待处理财产损益有余额怎么办
  • 冲暂估成本能冲部分暂估吗
  • 安装sql server 2008硬件要求
  • 什么是存储过程?有哪些优缺点?
  • 怎么把iphone作为u盘
  • mac系统怎么删除用户
  • win8.1内存占用过高
  • win10系统怎么打开软键盘
  • 手机更新升级版本下载
  • 景深图片的3d显示器
  • js对象属性值
  • jquery的用处
  • Bullet(cocos2dx)学习制作桌球游戏之前期准备
  • js中的冒泡排序原理
  • unity projector
  • python利用format方法保留三位小数
  • 手把手教怎么说
  • node cd
  • javascript页面
  • 煤炭资源税税率调整
  • 新疆税务局网站官网首页
  • 5种方式教你如何查询
  • 企业税务登记是什么证件
  • 注册一个信息咨询公司需要什么
  • 职称申报后附件打不开
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设