android选择文件
A. android自定义控件之文件选择
不多说,先上图:
列举当前目录下的所有文件,如果是选择目录,则不显示文件,如果是选择文件,则需要显示文件。
新建目录,就是在当前路径下新建目录,同时新建后的目录要能够及时显示在文件列表中。
需要读写权限,添加第三方权限请求库:
使用:
DialogFragment与Dialog有一些不同的地方,其中show方法需要传入FragmentManager
另外需在onCreateVie方法初始化布局,以及获取到控件
另外就是RecycleView,之所以采用RecycleView,是因为发现如果用ListView,内存会不断增加,很难降下来。
其中CommonAdapter继承自BaseAdapter,是通用的Adapter,兼容ListView:
这一部分逻辑有FileProvider类完成; 这里需要注意的是,有些手机不支持读取根目录,所以改为读取"/mnt/"作为根目录就行读取。
另外跳转目录都是改变当前路径,然后再刷新数据。
同时在其内部定义了FileData类:
文件选择,可以通过当前路径路径以及列表索引来唯一确定路径;都是,当跳转目录后,索引应该重置。
这里采用WeakReference记录选择的控件,但选择其他目录或者文件时,之前的控件需要重置一下状态。
https://github.com/xiaoyifan6/videocreator
该源码主要用于图片合成gif或者视频,其中文件选择弹窗是自己写的。感觉这个弹出应该有许多地方可以用到,所以写下这篇文章,方便以后参考查看。
B. Android编程 打开本地文件 文件选择器
布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
<Button
android:id="@+id/b01"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<ImageView
android:id="@+id/iv01"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
代码
java">import java.io.FileNotFoundException;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
public class Lesson_01_Pic extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button button = (Button)findViewById(R.id.b01);
button.setText("选择图片");
button.setOnClickListener(new Button.OnClickListener(){
@Override
public void onClick(View v) {
Intent intent = new Intent();
/* 开启Pictures画面Type设定为image */
intent.setType("image/*");
/* 使用Intent.ACTION_GET_CONTENT这个Action */
intent.setAction(Intent.ACTION_GET_CONTENT);
/* 取得相片后返回本画面 */
startActivityForResult(intent, 1);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
Uri uri = data.getData();
Log.e("uri", uri.toString());
ContentResolver cr = this.getContentResolver();
try {
Bitmap bitmap = BitmapFactory.decodeStream(cr.openInputStream(uri));
ImageView imageView = (ImageView) findViewById(R.id.iv01);
/* 将Bitmap设定到ImageView */
imageView.setImageBitmap(bitmap);
} catch (FileNotFoundException e) {
Log.e("Exception", e.getMessage(),e);
}
}
super.onActivityResult(requestCode, resultCode, data);
}
}
C. android中怎样自由选择文件保存路径
获取SD卡权限 然后通过获取SD卡目录 再通过流写入文件就可以了
D. android选择本地文件的问题
网络错误,你肯定选择成网络图片,不然为什么与网络相关呢?
抓一下log看一下运行流程,也可能调用了其他不相关的内容了。
到sd卡内目测一下那两张图片,将其移动到可以正常显示的图片目录下进一步测试。
E. android 有没有文件选择对话框
// filename: CallbackBundle.java
package com.example.openfiledemo;
import android.os.Bundle;
// 简单的Bundle参数回调接口
public interface CallbackBundle {
abstract void callback(Bundle bundle);
}
[java] view plain
// filename: CallbackBundle.java
package com.example.openfiledemo;
import android.os.Bundle;
// 简单的Bundle参数回调接口
public interface CallbackBundle {
abstract void callback(Bundle bundle);
}
然后的打开文件对话框的一下封装:
SimpleAdapter adapter = new SimpleAdapter(getContext(), list, R.layout.filedialogitem, new String[]{"img", "name", "path"}, new int[]{R.id.filedialogitem_img, R.id.filedialogitem_name, R.id.filedialogitem_path});
this.setAdapter(adapter);
return files.length;
}
@Override
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
// 条目选择
String pt = (String) list.get(position).get("path");
String fn = (String) list.get(position).get("name");
if(fn.equals(sRoot) || fn.equals(sParent)){
// 如果是更目录或者上一层
File fl = new File(pt);
String ppt = fl.getParent();
if(ppt != null){
// 返回上一层
path = ppt;
}
else{
// 返回更目录
path = sRoot;
}
}
else{
File fl = new File(pt);
if(fl.isFile()){
// 如果是文件
((Activity)getContext()).dismissDialog(this.dialogid); // 让文件夹对话框消失
// 设置回调的返回值
Bundle bundle = new Bundle();
bundle.putString("path", pt);
bundle.putString("name", fn);
// 调用事先设置的回调函数
this.callback.callback(bundle);
return;
}
else if(fl.isDirectory()){
// 如果是文件夹
// 那么进入选中的文件夹
path = pt;
}
}
this.refreshFileList();
}
}
}
[java] view plain
// filename: OpenFileDialog.java
package com.example.openfiledemo;
SimpleAdapter adapter = new SimpleAdapter(getContext(), list, R.layout.filedialogitem, new String[]{"img", "name", "path"}, new int[]{R.id.filedialogitem_img, R.id.filedialogitem_name, R.id.filedialogitem_path});
this.setAdapter(adapter);
return files.length;
}
@Override
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
// 条目选择
String pt = (String) list.get(position).get("path");
String fn = (String) list.get(position).get("name");
if(fn.equals(sRoot) || fn.equals(sParent)){
// 如果是更目录或者上一层
File fl = new File(pt);
String ppt = fl.getParent();
if(ppt != null){
// 返回上一层
path = ppt;
}
else{
// 返回更目录
path = sRoot;
}
}
else{
File fl = new File(pt);
if(fl.isFile()){
// 如果是文件
((Activity)getContext()).dismissDialog(this.dialogid); // 让文件夹对话框消失
// 设置回调的返回值
Bundle bundle = new Bundle();
bundle.putString("path", pt);
bundle.putString("name", fn);
// 调用事先设置的回调函数
this.callback.callback(bundle);
return;
}
else if(fl.isDirectory()){
// 如果是文件夹
// 那么进入选中的文件夹
path = pt;
}
}
this.refreshFileList();
}
}
}
F. Android中selector使用详解
选择器在android中使用的非常广泛,点击反馈、选中、使能、聚焦等状态切换都会用到选择器。
一:下面是一个简单的选择器:
android:enterFadeDuration="200" 、android:exitFadeDuration="200":进入新状态或退出旧状态时会有一个200毫秒的渐变动画。这两个属性使用的比较常见,可以使选择器的状态切换更加平滑。
以下几个都是Drawable的属性。
android:autoMirrored="true"对应drawable.setAutoMirrored(),这个属性表示是否将drawable镜像显示,只有在从右往左布局的环境下才会生效。将此属性设置成true,并将语言调节成阿拉伯语便可以看到效果。
android:dither="true"对应drawable.setDither(),这个属性表示是否对图像进行抖动处理。当图像的bit-color较少时,通过颜色值的抖动来增加可用颜色数量,并保持较好的显示效果。
android:visible="true" 对应drawable.setVisible(),设置Drawable是否可见,一般不会影响Drawable的行为,但是它是Drawable是否运行了动画的一个暗示。例如:AnimationDrawable可以通过这个方法启动或者停止动画。
剩下两个属性对应DrawableContainer$DrawableContainerState里面的属性(DrawableContainer是Drawable的一个子类,DrawableContainerState是DrawableContainer的内部类)。
android:constantSize="true":当选择器各个状态的图片大小不一时,设置为 true表示以最大的图片的尺寸显示,设置为false以默认的图片的尺寸显示(控件大小会对现象有影响,需要是包裹内容的)。
android:variablePadding="false" :默认为false,这个属性意义不大,通常不去设置。
二:Item的各种状态,理解起来相对简单,都可以从属性的名字去理解其含义,例如:
状态为加速的时候会显示ic_launcher_m图片,那么是什么加速呢?这就需要自己去分析一下,其实这里指的加速是对View的软件加速或硬件加速。
当给View设置background、foreground或ImageView设置src时只能写android:drawable="id":
当给文字颜色添加选择器的时候必须要写android:color="ARGB|RGB颜色值"
三:注意安卓程序在读取选择器文件时,是从上往下一个一个节点进行遍历的,程序会选择符合当前控件状态的第一个Item的内容。如果一个Item不写任何状态,表示它任何状态都符合, 所以一般最后一个Item是不会写任何状态的(就像if(){}else if(){}else{}语句一样,最后一个包含了剩下的所有情况)。
四:选择器的Item和animated-rotate一起使用。
五:动态创建选择器
动态创建一个简单的选择器:
用一张图片,通过对图片的着色创建选择器:
创建矢量图选择器:
TextView文字颜色选择器:
部分常用状态数组:
G. 关于android怎么动态调用资源文件使根据不同的情况选择不同的资源文件
android ndk下面生成动态库so文件的方法很多,但是这里只提供一种方法,更多的生成方法可以看,“ndk 编译静态库”:
http://jingyan..com/article/63f236280b90690208ab3d12.html
2
fkAdd.c 的内容如下:
#include <jni.h>
int fkAdd(int nX, int nY)
{
return nX + nY;
}
3
Android.mk 的内容如下:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE:= fkAdd
LOCAL_SRC_FILES:= fkAdd.c
include $(BUILD_SHRRED_LIBRARY)
1、打开 eclipse
2、点击 文件
3、点击 新建
4、点击 other...
1、展开 Android 选项;
2、选择 Android Project from Existing Code;
3、点击 Next
1、输入 Root Director;
2、取消 tests;
3、选中 Copy projects into workspace;
4、点击 Finish;
1、右键工程;
2、选择 Android Tools;
3、Add Native Support...;
点击 Finish
修改android sdk 版本为 4.0.3;
关于如何修改 android sdk 版本:
http://jingyan..com/article/c910274bfdd000cd371d2d4b.html
修改 Min SDK version:15
修改 Target SDK version:19
在jni目录下面新建文件fkAdd.c 的内容如下:
int fkAdd(int nX, int nY)
{
return nX + nY;
}
临时修改 Android.mk 文件内容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
#LOCAL_MODULE := hello-jni
#LOCAL_SRC_FILES := hello-jni.c
LOCAL_MODULE := fkaddso
LOCAL_SRC_FILES := fkAdd.c
include $(BUILD_SHARED_LIBRARY)
使用快捷键Ctrl+B编译后可以在libs目录下面看到生成的一些列的
libfkaddso.so文件,如下图所示
H. android 文件选择
privatevoidopenFileBrowse(){
Intentintent=newIntent(Intent.ACTION_GET_CONTENT);
intent.setType("*/*");//文件类型
IntentwrapperIntent=Intent.createChooser(intent,"打开方式");
startActivityForResult(wrapperIntent,0);
}
protectedvoidonActivityResult(intrequestCode,intresultCode,
Intentintent){
//Stringpath;
if(resultCode==RESULT_OK){
if(requestCode==0){
if(intent==null){
Toast.makeText(this,"未选择任何文件",Toast.LENGTH_LONG).show();
return;
}
Uriuri=intent.getData();
if(uri==null){
Toast.makeText(this,"未选择任何文件",Toast.LENGTH_LONG).show();
return;
}
Stringscheme=uri.getScheme();
//可能是content,file等等.需要判断其是不是file
如果不是调用文件管理器,可能返回其他
if(scheme!=null
&&("file".endsWith(scheme.toLowerCase()))
Stringpath=uri.getPath();//文件路径
}
}
}
I. android是根据什么去选择三种drawable文件夹下的图片
是根据drawable文件夹的修饰符进行选择的。
比如drawable、drawable-ldpi、drawable-mdpi、drawable-hdpi、drawable-xhdpi、drawalbe-xxhdpi、drawable-xxxhdpi
根据修饰符进行优先匹配。
不同的dpi修饰符对应的dpi如下
drawable-ldpi 120DPI
drawable-mdpi 160DPI
drawable-hdpi 240DPI
drawable-xhdpi 320DPI
drawalbe-xxhdpi 480DPI
drawable-xxxhdpi 640DPI
dpi是根据手机的当前分辨率ppi归一化得到的。
那么PPI如何得来的?
如果手机的宽为X,高为Y,屏幕大小为Z英寸,那么
公式中的X2其实是X的平方,即X*X。
比如三星手机I9260分辨率是1280*720,屏幕大小是4.65英寸,那么计算得到的PPI就是315.8PPI
找一个最近的DPI值应该是320DPI,也就是这个设备被归一化后就是320DPI。属于xhdpi。
系统取图片时会优先选择drawable-xhdpi里面的图片,如果drawable-xhdpi不存在或者没有这张图,就会就近从其它分辨率和默认的无后缀drawable文件夹下取。
比如工程只有在draw-xxhdpi文件下有img图片,而你的设置是xhdpi,就会从xxhdpi取完图片再压缩到对应大小返回给使用者。