Android编程 打开本地文件 文件选择器

Android编程 打开本地文件 文件选择器,第1张

布局文件

<xml version="10" encoding="utf-8"> 

<LinearLayout xmlns:android=";

代码

import javaioFileNotFoundException; 

import androidappActivity; 

import androidcontentContentResolver; 

import androidcontentIntent; 

import androidgraphicsBitmap; 

import androidgraphicsBitmapFactory; 

import androidnetUri; 

import androidosBundle; 

import androidutilLog; 

import androidviewView; 

import androidwidgetButton; 

import androidwidgetImageView; 

public class Lesson_01_Pic extends Activity { 

    / Called when the activity is first created / 

    @Override 

    public void onCreate(Bundle savedInstanceState) { 

        superonCreate(savedInstanceState); 

        setContentView(Rlayoutmain); 

             

        Button button = (Button)findViewById(Ridb01); 

        buttonsetText("选择"); 

        buttonsetOnClickListener(new ButtonOnClickListener(){ 

            @Override 

            public void onClick(View v) { 

                Intent intent = new Intent(); 

                / 开启Pictures画面Type设定为image / 

                intentsetType("image/"); 

                / 使用IntentACTION_GET_CONTENT这个Action / 

                intentsetAction(IntentACTION_GET_CONTENT);  

                / 取得相片后返回本画面 / 

                startActivityForResult(intent, 1); 

            } 

                 

        }); 

    } 

         

    @Override 

    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 

        if (resultCode == RESULT_OK) { 

            Uri uri = datagetData(); 

            Loge("uri", uritoString()); 

            ContentResolver cr = thisgetContentResolver(); 

            try { 

                Bitmap bitmap = BitmapFactorydecodeStream(cropenInputStream(uri)); 

                ImageView imageView = (ImageView) findViewById(Ridiv01); 

                / 将Bitmap设定到ImageView / 

                imageViewsetImageBitmap(bitmap); 

            } catch (FileNotFoundException e) { 

                Loge("Exception", egetMessage(),e); 

            } 

        } 

        superonActivityResult(requestCode, resultCode, data); 

    } 

}

1、ViewRoot 对应于 ViewRootImpl 类,它是连接 WindowManager 和 DecorView 的纽带,View 的三大流程均是通过 ViewRoot 来完成的。在 ActivityThread 中,当 Activity 对象被创建完毕后,会将 DecorView 添加到 Window 中,同时会创建 ViewRootImpl 对象,并将 ViewRootImpl 对象和 DecorView 建立关联

2、 自定义View-绘制流程概述

4、 Android Handler

6、 Android Bitmap

2、MeasureSpec:

3、一般来说,使用多进程会造成以下几个方面的问题:

5、Window 概念与分类:

Window 是一个抽象类,它的具体实现是 PhoneWindow。WindowManager 是外界访问 Window 的入口,Window 的具体实现位于 WindowManagerService 中,WindowManager 和 WindowManagerService 的交互是一个 IPC 过程。Android 中所有的视图都是通过 Window 来呈现,因此 Window 实际是 View 的直接管理者。

6、window的三大 *** 作:addView、upView、removeView

7、 Bitmap 中有两个内部枚举类:

保存资源:

压缩:

基本使用:

8、Context 本身是一个抽象类,是对一系列系统服务接口的封装,包括:内部资源、包、类加载、I/O *** 作、权限、主线程、IPC 和组件启动等 *** 作的管理。ContextImpl, Activity, Service, Application 这些都是 Context 的直接或间接子类

9、SharedPreferences 采用key-value(键值对)形式, 主要用于轻量级的数据存储, 尤其适合保存应用的配置参数, 但不建议使用 SharedPreferences 来存储大规模的数据, 可能会降低性能

10、SharedPreferences源码有用synchronize进行加锁同步

11、Handler 有两个主要用途:

(1)安排 Message 和 runnables 在将来的某个时刻执行;

(2)将要在不同于自己的线程上执行的 *** 作排入队列。(在多个线程并发更新UI的同时保证线程安全。)

只有主线程能对UI进行 *** 作,所以在对UI进行跟改之前,ViewRootImpl 对UI *** 作做了验证,这个验证工作是由 ViewRootImpl的 checkThread 方法完成:

12、ThreadLocal 是一个线程内部的数据存储类,通过它可以在指定的线程中存储数据,其他线程则无法获取。Looper、ActivityThread 以及 AMS 中都用到了 ThreadLocal。当不同线程访问同一个ThreadLocal 的 get方法,ThreadLocal 内部会从各自的线程中取出一个数组,然后再从数组中根据当前 ThreadLcoal 的索引去查找对应的value值:

13、Android 提供了几种途径来从其他线程访问 UI 线程:

Android单线程模式必须遵守的规则:

14、HandlerThread 集成了 Thread,却和普通的 Thread 有显著的不同。普通的 Thread 主要用于在 run 方法中执行一个耗时任务,而 HandlerThread 在内部创建了消息队列,外界需要通过 Handler 的消息方式通知 HanderThread 执行一个具体的任务。

15、IntentService 可用于执行后台耗时的任务,当任务执行后会自动停止,由于其是 Service 的原因,它的优先级比单纯的线程要高,所以 IntentService 适合执行一些高优先级的后台任务。在实现上,IntentService 封装了 HandlerThread 和 Handler。IntentService 第一次启动时,会在 onCreatea 方法中创建一个 HandlerThread,然后使用的 Looper 来构造一个 Handler 对象 mServiceHandler,这样通过 mServiceHandler 发送的消息最终都会在 HandlerThread 中执行。每次启动 IntentService,它的 onStartCommand 方法就会调用一次,onStartCommand 中处理每个后台任务的 Intent,onStartCommand 调用了 onStart 方法。可以看出,IntentService 仅仅是通过 mServiceHandler 发送了一个消息,这个消息会在 HandlerThread 中被处理。mServiceHandler 收到消息后,会将 Intent 对象传递给 onHandlerIntent 方法中处理,执行结束后,通过 stopSelf(int startId) 来尝试停止服务。(stopSelf() 会立即停止服务,而 stopSelf(int startId) 则会等待所有的消息都处理完毕后才终止服务)。

16、RecyclerView 优化

在项目中遇到需要调用系统相机的功能点,整理方法如下

1拍照完成之后直接存

Intent intent = new Intent(MediaStoreACTION_IMAGE_CAPTURE);

intentputExtra("crop", "true");// crop=true 有这句才能出来最后的裁剪页面

intentputExtra("aspectX", 5); // 这两项为裁剪框的比例

intentputExtra("aspectY", 4);

intentputExtra("output", UrifromFile(new File("SDCard/1jpg")));//输出地址

intentputExtra("outputFormat", "JPEG");//返回格式

startActivityForResult(intent, REQUEST_CAMERA);

获取直接在onActivityForResult中

BitmapFactorydecodeFile(fileName, opts);

2拍照完成后读取intent中的数据,在onActivityForResult中

Uri uri = datagetData();

ContentResolver cr = thisgetContentResolver();

try {

bitmap = BitmapFactorydecodeStream(cropenInputStream(uri));

} catch (FileNotFoundException e) {

eprintStackTrace();

}

详细

1调用系统照相机

Intent intent = new Intent(MediaStoreACTION_IMAGE_CAPTURE);

startActivityForResult(intent, 1);

2 onActivityResult中处理回调

if (resultCode == ActivityRESULT_OK) {

String sdStatus = EnvironmentgetExternalStorageState();

if (!sdStatusequals(EnvironmentMEDIA_MOUNTED)) { // 检测sd是否可用

Logi("TestFile",

"SD card is not avaiable/writeable right now");

return;

}

String name = new DateFormat()format("yyyyMMdd_hhmmss",CalendargetInstance(LocaleCHINA)) + "jpg";

ToastmakeText(this, name, ToastLENGTH_LONG)show();

Bundle bundle = datagetExtras();

Bitmap bitmap = (Bitmap) bundleget("data");// 获取相机返回的数据,并转换为Bitmap格式

FileOutputStream b = null;

File file = new File("/sdcard/myImage/");

filemkdirs();// 创建文件夹

String fileName = "/sdcard/myImage/"+name;

try {

b = new FileOutputStream(fileName);

bitmapcompress(BitmapCompressFormatJPEG, 100, b);// 把数据写入文件

} catch (FileNotFoundException e) {

eprintStackTrace();

} finally {

try {

bflush();

bclose();

} catch (IOException e) {

eprintStackTrace();

}

}

((ImageView) findViewById(RidimageView))setImageBitmap(bitmap);// 将显示在ImageView里

}

先初始化;

注意自定义 的

private final String IMAGE_TYPE = "image/";private final int IMAGE_CODE = 0;

private void setImage() {

Intent getAlbum = new Intent(IntentACTION_GET_CONTENT);    getAlbumsetType(IMAGE_TYPE);    startActivityForResult(getAlbum, IMAGE_CODE);}

这里使用Intent获得相册数据,并返回原来界面;

这里说明一下

startActivityForResult(getAlbum, IMAGE_CODE);

补充{

startActivityForResult与startActivity的不同之处在于:

1、startActivity( ) 

仅仅是跳转到目标页面,若是想跳回当前页面,则必须再使用一次startActivity( )。

2、startActivityForResult( ) 

可以一次性完成这项任务,当程序执行到这段代码的时候,假若从T1Activity跳转到下一个Text2Activity,而当这个Text2Activity调用了finish()方法以后,程序会自动跳转回T1Activity,并调用前一个T1Activity中的onActivityResult( )方法。

}

startActivityForResult(getAlbum, IMAGE_CODE);

这里采用startActivityForResult来做跳转,此处的IMAGE_CODE实质是0为一个依据,可以写其他的值,但一定要>=0

然后重写onActivityResult用于接收刚刚得到的数据

protected  void onActivityResult(int requestCode, int resultCode, Intent data) {

Bitmap bm = null;    ContentResolver resolver = getContentResolver();    if (requestCode == IMAGE_CODE) {        try {

Uri originalUri = datagetData();            bm = MediaStoreImagesMediagetBitmap(resolver, originalUri);            imgShowsetImageBitmap(bm);        } catch (IOException e) {

eprintStackTrace();        }

}

补充{

ContentProvider-----数据提供给第三方应用程序使用时使用

因为在Android系统里面,数据库是私有的。一般情况下外部应用程序是没有权限读取其他应用程序的数据。如果你想公开你自己的数据,你有两个选择:你可以创建你自己的内容提供器(一个ContentProvider子类)或者你可以给已有的提供器添加数据-如果存在一个控制同样类型数据的内容提供器且你拥有写的权限

}

这里是创建一个新的内容提供器,然后在Activity当中通过getContentResolver()可以得到当前应用的 ContentResolver实例

if (requestCode == IMAGE_CODE) {

resultCode为回传的标记这句话是在确认是否回传的是你所需要的;如果是就执行try;不然就执行catch (IOException e) {

eprintStackTrace();}先说这里当try语句中出现异常是时,会执行catch中的语句,IOException e也就是实例化Exception类型的对象。e是此对象引用名称。然后e(引用)会自动调用Exception类中指定的方法,也就出现了eprintStackTrace() ;。printStackTrace()方法的意思是:在命令行打印异常信息在程序中出错的位置及原因。

try {

Uri originalUri = datagetData();    bm = MediaStoreImagesMediagetBitmap(resolver, originalUri);    imgShowsetImageBitmap(bm);接收数据处理数据并显示照片。

然后进行测试。

另附源码:

MainActivity:

package comexampleadministratormyapplication1;import androidgraphicsBitmapFactory;import androidsupportv7appAppCompatActivity;import androidosBundle;import javaioIOException;import androidnetUri;import androidosBundle;import androidproviderMediaStore;import androidappActivity;import androidcontentContentResolver;import androidcontentIntent;import androidgraphicsBitmap;import androidviewView;import androidviewViewOnClickListener;import androidwidgetButton;import androidwidgetImageView;public class MainActivity extends AppCompatActivity {    private final String IMAGE_TYPE = "image/";    private final int IMAGE_CODE = 0;    private Button choose=null;    private ImageView imgShow;    @Override    protected void onCreate(Bundle savedInstanceState) {        superonCreate(savedInstanceState);        setContentView(Rlayoutactivity_main);        init();}    private void init() {       choose=(Button) findViewById(Ridbutton1);        imgShow=(ImageView) findViewById(RidimgShow);        choosesetOnClickListener(listener);    }    private OnClickListener listener=new OnClickListener(){        @Override        public void onClick(View v) {

setImage();            }

};        private void setImage() {

Intent getAlbum = new Intent(IntentACTION_GET_CONTENT);            getAlbumsetType(IMAGE_TYPE);            startActivityForResult(getAlbum, IMAGE_CODE);        }    protected  void onActivityResult(int requestCode, int resultCode, Intent data) {

Bitmap bm = null;        ContentResolver resolver = getContentResolver();        if (requestCode == IMAGE_CODE) {            try {

Uri originalUri = datagetData();                bm = MediaStoreImagesMediagetBitmap(resolver, originalUri);                imgShowsetImageBitmap(bm);            } catch (IOException e) {

eprintStackTrace();            }

}

}

}

layout:activity_mainxml:

<xml version="10" encoding="utf-8"><LinearLayout xmlns:android=">

以上就是关于Android编程 打开本地文件 文件选择器全部的内容,包括:Android编程 打开本地文件 文件选择器、Android:窗口、自定义view、bitmap、请教一个Android开发问题调用系统的相机的时候报空指针。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9527650.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-29
下一篇2023-04-29

发表评论

登录后才能评论

评论列表(0条)

    保存