2015-01-09 13:42:07 lib739449500 阅读数 600
  • 安卓开发多线程精讲一学就会

    详细介绍按照得多线程开发,handler消息机制,AsyncTask(异步操作),访问网络,访问sql sever 数据库。从网络上获取图片等开发所需基础知识,简单异动,照顾新手

    388 人正在学习 去看看 朱祚华

1.就自己研究写一下android拍照获取图片,自己主要试了两种方法

  1).当不指定图片保存路径时。系统返回的时缩略图。

 

Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(takePictureIntent, 2);

     可通过下面得到bitmap,从而设置图片。

     

if (data != null) {
// 返回有缩略图,不清晰
if (data.hasExtra("data")) {
Bitmap thumbnail = data.getParcelableExtra("data");
imageview.setImageBitmap(thumbnail);
}
    }

  2).当指定图片保存路径时,需要指定一个uri路径,下面两种指定方式。

    <1>.使用contentValues指定uri

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
SimpleDateFormat timeStampFormat = new SimpleDateFormat(
"yyyyMMdd_HHmmss");
String filename = timeStampFormat.format(new Date());
ContentValues values = new ContentValues();
values.put(Media.TITLE, filename);
photoUri = getContentResolver().insert(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
values);
intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
startActivityForResult(intent, 2);

  <2>.创建file指定uri

// 指定存放拍摄照片的位置
File f = createImageFile();//sd卡创建文件文件,可自己写个方法,很简单这里我//就不写了
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f));
startActivityForResult(intent, 2);

 

 

 

这样在拍照返回结果中就可以通过data获取图片uri了。如下:

if (resultCode == Activity.RESULT_OK) {
Uri uri = null;
if (data != null && data.getData() != null) {
uri = data.getData();
}
// 大部分手机可能无法从getData中获取uri,则需手动指定拍照后存储照片的Uri
if (uri == null) {
if (photoUri != null) {
uri = photoUri;
}
}
//接下来就可以通过image的setImageURI方法放到你的页面上了。
imageview.setImageURI(uri);//也可以通过uri获取bitmap对象设置,但这是就可能出现oom,所以得压缩处理后再设置,很简单我就不写了

2017-01-19 14:34:23 qq_26650589 阅读数 466
  • 安卓开发多线程精讲一学就会

    详细介绍按照得多线程开发,handler消息机制,AsyncTask(异步操作),访问网络,访问sql sever 数据库。从网络上获取图片等开发所需基础知识,简单异动,照顾新手

    388 人正在学习 去看看 朱祚华

    效果图:

                      


1、布局界面代码:

  <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="stare"
        android:text="获取网络图片" />

    <ImageView
        android:id="@+id/img"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
没有很多东东,就一个按钮一个ImageView控件


2、MainActivity.java

	//图片地址
	protected static final String PATH_BD = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1484816431839&di=d6a5e41cc3ebaff123ff8ed134df4578&imgtype=0&src=http%3A%2F%2Fnewsimg.5054399.com%2Fuploads%2Fuserup%2F1601%2F2910123392K.jpg";
	protected static final int BITIME = 0;
	public ImageView img;
	public Handler handler;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		img=(ImageView) findViewById(R.id.img);	
		handler=new Handler(new Callback() {

			@Override
			public boolean handleMessage(Message msg) {
				if(msg.what==BITIME){
					Bitmap bit=(Bitmap) msg.obj;
					//设置图片到img中
					img.setImageBitmap(bit);

				}

				return true;
			}
		});

	}
	public void stare(View view){

		new Thread(){ 
			public void run() {
				HttpURLConnection conn=null;
				InputStream is=null;
				ByteArrayOutputStream bos=null;

				try {
					URL url = new URL(PATH_BD);
					conn=(HttpURLConnection) url.openConnection();
					//请求方式
					conn.setRequestMethod("GET");
					// 读取超时  
					conn.setConnectTimeout(5000);
					// 连接超时  
					conn.setReadTimeout(10000);
					conn.connect();
					//获取响应码
					if(conn.getResponseCode()==200){
						//拿到流
						is=conn.getInputStream();
						bos=new ByteArrayOutputStream();
						int count=0;
						//开辟空间
						byte[] buffer=new byte[1024];
						while ((count=is.read(buffer))!=-1) {
							bos.write(buffer, 0, count);
						}
						byte[] buff=bos.toByteArray();
						Bitmap bitmap=BitmapFactory.decodeByteArray(buff, 0, buff.length);
						handler.obtainMessage(BITIME, bitmap).sendToTarget();
					}
				} catch (MalformedURLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			};
		}.start();

	}

3、使用网络需要加入网络访问权限Internet

  <uses-permission android:name="android.permission.INTERNET" />



2015-06-30 11:20:36 like_3306 阅读数 404
  • 安卓开发多线程精讲一学就会

    详细介绍按照得多线程开发,handler消息机制,AsyncTask(异步操作),访问网络,访问sql sever 数据库。从网络上获取图片等开发所需基础知识,简单异动,照顾新手

    388 人正在学习 去看看 朱祚华

android获取网络图片简单实现

在我们平时做项目的时候肯定少不了要从网络上获取图片的资源,此篇文章就讲一讲从网络上获取图片,我们要考虑的问题是

  • 1.获取怎样的url
  • 2.用什么方法获取(以前有学习web开发的同学考虑一下ajax或者从后台获取交互数据的方法在此是否适用)
  • 3.获取到的数据是否就是图片资源,是否还要解析
  • 4.直接用主线程是否适用
  • 5.怎样将最终得到的图片资源显示到activity中

                        URL url = new URL(path);
                        // 发出http请求
                        HttpURLConnection huc = (HttpURLConnection) url
                                .openConnection();
                        // 发送请求类型
                        huc.setRequestMethod("GET");
                        // 设置连接超时时间(五秒)
                        huc.setConnectTimeout(5000);

                        // 接收返回信息类型
                        int responsecode = huc.getResponseCode();//此处非常类似javascript中的ajax
  • 3.将从网络上的流转化为需要的图片资源
if (responsecode == 200) {// 当返回正确到达
                            InputStream is = huc.getInputStream();// 获取文件输入流
                            Bitmap bm = BitmapFactory.decodeStream(is);// 使用位图工厂将流变换为图
                            }


  • 4.如果在需要在子线程中实现2.3两步
  • 5.将最终获取的图片显示到activity中

:当一个程序第一次启动时,Android会同时启动一个对应的主线程(Main Thread),主线程主要负责处理与UI相关的事件,如:用户的按键事件,用户接触屏幕的事件以及屏幕绘图事件,并把相关的事件分发到对应的组件进行处理。所以主线程通常又被叫做UI线程。
  比如说从网上获取一个图片,在一个ImageView中将其显示出来,这种涉及到网络操作的程序一般都是需要开一个线程完成网络访问,但是在获得图片后,是不能直接在网络操作线程中调用ImageView的相关方法的,因为其他线程中是不能直接访问主UI线程成员 。
  如果在子线程中改变主线程的内容操作系统会担心数个线程同时操作一个控件而导致的不安全,所以限制子线程不得直接访问主UI线程成员的
  故而:用到了Handler
  private   Handler h = new Handler() {
        public void handleMessage(android.os.Message msg) {
            // 对接收的数据进行处理
            switch (msg.what) {
            case SHOW_IMAGE:
                Bitmap bitmap = (Bitmap) msg.obj;
                iv_imeages.setImageBitmap(bitmap);

                break;

            default:
                break;
            }
        };
    };
if (responsecode == 200) {// 当返回正确到达
                            InputStream is = huc.getInputStream();// 获取文件输入流
                            Bitmap bm = BitmapFactory.decodeStream(is);// 使用位图工厂将流变换为图片
                            // 告诉主线程帮我更新页面,内容是bm
                            Message msg = new Message();
                            msg.what = SHOW_IMAGE;
                            msg.obj = bm;
                            h.sendMessage(msg);
                            //iv_imeages.setImageBitmap(bm);//不能再子线程中更新view视图(因为视图不是线程安全的)
                        }

完整代码块:

package cn.edu.bzu.intnetimages;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import android.R.string;
import android.animation.ArgbEvaluator;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;

public class MainActivity extends Activity {
    private Button btn_show;
    private  ImageView iv_imeages;
    private EditText et_url;
    private  final int SHOW_IMAGE = 1;
    // 在主线程中创建消息处理器
    private   Handler h = new Handler() {
        public void handleMessage(android.os.Message msg) {
            // 对接收的数据进行处理
            switch (msg.what) {
            case SHOW_IMAGE:
                Bitmap bitmap = (Bitmap) msg.obj;
                iv_imeages.setImageBitmap(bitmap);

                break;

            default:
                break;
            }
        };
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn_show = (Button) findViewById(R.id.btn_show);
        iv_imeages = (ImageView) findViewById(R.id.iv_images);
        et_url = (EditText) findViewById(R.id.et_url);
        // 当点击按钮的时候
        btn_show.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                        showImage();



            }
        });

    }   

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    /**
     * http://pic46.nipic.com/20140813/10153265_103918805357_2.jpg
     * 用传统的方法获取网络上的图片信息
     */
    public void showImage() {
        final String path = et_url.getText().toString();// 获取url
        if (TextUtils.isEmpty(path)) {// 当用户输入的url为空的时候
            Toast.makeText(MainActivity.this, "url为空", Toast.LENGTH_SHORT)
                    .show();

        } else {// 当用户输入的url不为空的时候
            new Thread() {
                public void run() {
                    // 连接服务器获取图片信息
                    try {
                        // 传入url
                        URL url = new URL(path);
                        // 发出http请求
                        HttpURLConnection huc = (HttpURLConnection) url
                                .openConnection();
                        // 发送请求类型
                        huc.setRequestMethod("GET");
                        // 设置连接超时时间(五秒)
                        huc.setConnectTimeout(5000);

                        // 接收返回信息类型
                        int responsecode = huc.getResponseCode();
                        if (responsecode == 200) {// 当返回正确到达
                            InputStream is = huc.getInputStream();// 获取文件输入流
                            Bitmap bm = BitmapFactory.decodeStream(is);// 使用位图工厂将流变换为图片
                            // 告诉主线程帮我更新页面,内容是bm
                            Message msg = new Message();
                            msg.what = SHOW_IMAGE;
                            msg.obj = bm;
                            h.sendMessage(msg);
                            //iv_imeages.setImageBitmap(bm);//不能再子线程中更新view视图(因为视图不是线程安全的)
                        } else {
                            Toast.makeText(MainActivity.this, "显示图片失败",
                                    Toast.LENGTH_SHORT).show();
                        }
                    } catch (MalformedURLException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }.start();
        }

    }
}
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    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=".MainActivity" >

    <ImageView
        android:id="@+id/iv_images"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/et_url"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="32dp"
        android:layout_marginTop="40dp"
        android:src="@drawable/ic_launcher" />

    <EditText
        android:id="@+id/et_url"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:ems="10"
        android:text="http://pic46.nipic.com/20140813/10153265_103918805357_2.jpg"

       />

    <Button
        android:id="@+id/btn_show"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/iv_images"
        android:layout_alignParentBottom="true"
        android:layout_marginBottom="14dp"
        android:layout_marginLeft="21dp"
        android:text="Button" />

</RelativeLayout>

最终千万别忘了在AndroidManifest.xml文件中添加访问网络的权限啊:

 <uses-permission android:name="android.permission.INTERNET"/>
2016-02-06 23:51:08 u013783167 阅读数 1108
  • 安卓开发多线程精讲一学就会

    详细介绍按照得多线程开发,handler消息机制,AsyncTask(异步操作),访问网络,访问sql sever 数据库。从网络上获取图片等开发所需基础知识,简单异动,照顾新手

    388 人正在学习 去看看 朱祚华

# android 如何读取本地超大图片

    ``` java
    public static Bitmap getimage(String srcPath,int size) {
    // 该对象为图片缩放操作对象
    BitmapFactory.Options newOpts = new BitmapFactory.Options();
    //开始读入图片,该参数为true时,只会在读取图片的宽高 而不产生bitmap 无论图片大小 都用他读取。
    newOpts.inJustDecodeBounds = true;
    Bitmap bitmap = BitmapFactory.decodeFile(srcPath,newOpts);//此时返回bm为空
    //读取后一定要 设置成false;
    newOpts.inJustDecodeBounds = false ;
    //获取 原图图片的长和宽
    int realw = newOpts.outWidth;
    int realh = newOpts.outHeight;
    //现在主流手机比较多是800*480分辨率,所以高和宽我们设置为
            float hh = 800f;//这里设置高度为800f   缩放后的长
            float ww = 480f;//这里设置宽度为480f   缩放后的宽
            //缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可
            int options = 1;//be=1表示不缩放
            if (realw> h && realw > ww) {
                //如果宽度大的话根据宽度固定大小缩放
                options = (int) (newOpts.outWidth / ww);
            } else if (realw < realh && realh> hh) {
                //如果高度高的话根据宽度固定大小缩放
                options = (int) (newOpts.outHeight / hh);
            }
            if (options <= 0)
                options = 1;    

            newOpts.inSampleSize = options;//设置缩放比例
            //重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了
            bitmap = BitmapFactory.decodeFile(srcPath, newOpts);
                    //如果是一张超大图的话  经过以上处理 图片应该就变成了一个800x480的图片了      
            //以上是尺寸 缩放,一般这样处理后就不会oom了,如果还要oom 就进行质量压缩
            //return bitmap;
            return  compressImage(bitmap,size);
    }


    /**
     * 
     * @param image 要压缩的bitmap
     * @param size 要控制的大小(单位为kb)
     * @return
     */
    private static Bitmap compressImage(Bitmap image,int size) {
        if(image==null){
            return null;
        }
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        image.compress(Bitmap.CompressFormat.JPEG, 100, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中
        int options = 100;
        LogUtil.i("图片大小1", baos.toByteArray().length);
        while ( baos.toByteArray().length >size) {  //循环判断如果压缩后图片是否大于size kb,大于继续压缩     
            baos.reset();//重置baos即清空baos
            image.compress(Bitmap.CompressFormat.JPEG, options, baos);//这里压缩options%,把压缩后的数据存放到baos中
            options -= 10;//每次都减少10
        }
        ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());//把压缩后的数据baos存放到ByteArrayInputStream中
        LogUtil.i("图片大小2", baos.toByteArray().length);
        Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);//把ByteArrayInputStream数据生成图片
        return bitmap;
    }
    ```
2016-06-17 16:07:51 qq_16628781 阅读数 352
  • 安卓开发多线程精讲一学就会

    详细介绍按照得多线程开发,handler消息机制,AsyncTask(异步操作),访问网络,访问sql sever 数据库。从网络上获取图片等开发所需基础知识,简单异动,照顾新手

    388 人正在学习 去看看 朱祚华

android之获取网络图片

/**
     * 从服务器获取图片资源
     *
     * @param url 服务器上图片的链接地址
     */
    private Bitmap getHttpBitmap(String url) {
        URL myUrl = null;
        Bitmap bitmap = null;
        Log.d("TAG", url);
        try {
            myUrl = new URL(url);
            //新建一个HttpURLConnection连接
            HttpURLConnection conn = (HttpURLConnection) myUrl.openConnection();
            conn.setConnectTimeout(2000);//设置HttpURLConnection连接超时,时间为2S
            conn.setDoInput(true);
            conn.connect();
            InputStream is = conn.getInputStream();
            bitmap = BitmapFactory.decodeStream(is);
            is.close();
            //conn.disconnect();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return bitmap;
    }
}

如有任何疑问,请及时与我联系。

Android 图片文件读取

阅读数 18375

没有更多推荐了,返回首页