編輯:關於Android編程
如題:
重點在於ContentPrivider的使用,和圖片的顯示上
首先在使用ContentPrivider查找圖片前,先將sd卡整個掃描一遍,要不然的話你可能剛剛添加的圖片是不會查找出來的。
[html] view plaincopyprint?
// 必須在查找前進行全盤的掃描,否則新加入的圖片是無法得到顯示的(加入對sd卡操作的權限)
public void allScan() {
sendBroadcast(new Intent(
Intent.ACTION_MEDIA_MOUNTED,
Uri.parse("file://" + Environment.getExternalStorageDirectory())));
}
// 必須在查找前進行全盤的掃描,否則新加入的圖片是無法得到顯示的(加入對sd卡操作的權限)
public void allScan() {
sendBroadcast(new Intent(
Intent.ACTION_MEDIA_MOUNTED,
Uri.parse("file://" + Environment.getExternalStorageDirectory())));
}加入對sd卡訪問的權限:
[html] view plaincopyprint?
<uses-permission android:name="android.permission.RESTART_PACKAGES" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RESTART_PACKAGES" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
下一步就可以使用ContentPrivider了:
[html] view plaincopyprint?
/**
* @FILE:ImageService.java
* @AUTHOR:hui-ye
* @DATE:2013-5-21 下午3:30:41
**/
package com.image.service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.provider.MediaStore;
/*******************************************
*
* @CLASS:ImageService
* @DESCRIPTION:
* @AUTHOR:hui-ye
* @VERSION:v1.0
* @DATE:2013-5-21 下午3:30:41
*******************************************/
public class ImageService {
private Context context;
public ImageService(Context context) {
this.context = context;
}
/**
* @description:通過contentprovider獲得sd卡上的圖片
* @author:hui-ye
* @return:void
*/
public List<HashMap<String, String>> getImages() {
// 指定要查詢的uri資源
Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
// 獲取ContentResolver
ContentResolver contentResolver = context.getContentResolver();
// 查詢的字段
String[] projection = { MediaStore.Images.Media._ID,
MediaStore.Images.Media.DISPLAY_NAME,
MediaStore.Images.Media.DATA, MediaStore.Images.Media.SIZE };
// 條件
String selection = MediaStore.Images.Media.MIME_TYPE + "=?";
// 條件值(這裡的參數不是圖片的格式,而是標准,所有不要改動)
String[] selectionArgs = { "image/jpeg" };
// 排序
String sortOrder = MediaStore.Images.Media.DATE_MODIFIED + " desc";
// 查詢sd卡上的圖片
Cursor cursor = contentResolver.query(uri, projection, selection,
selectionArgs, sortOrder);
List<HashMap<String, String>> imageList = new ArrayList<HashMap<String, String>>();
if (cursor != null) {
HashMap<String, String> imageMap = null;
cursor.moveToFirst();
while (cursor.moveToNext()) {
imageMap = new HashMap<String, String>();
// 獲得圖片的id
imageMap.put("imageID", cursor.getString(cursor
.getColumnIndex(MediaStore.Images.Media._ID)));
// 獲得圖片顯示的名稱
imageMap.put("imageName", cursor.getString(cursor
.getColumnIndex(MediaStore.Images.Media.DISPLAY_NAME)));
// 獲得圖片的信息
imageMap.put(
"imageInfo",
""
+ cursor.getLong(cursor
.getColumnIndex(MediaStore.Images.Media.SIZE) / 1024)
+ "kb");
// 獲得圖片所在的路徑(可以使用路徑構建URI)
imageMap.put("data", cursor.getString(cursor
.getColumnIndex(MediaStore.Images.Media.DATA)));
imageList.add(imageMap);
}
// 關閉cursor
cursor.close();
}
return imageList;
}
}
/**
* @FILE:ImageService.java
* @AUTHOR:hui-ye
* @DATE:2013-5-21 下午3:30:41
**/
package com.image.service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.provider.MediaStore;
/*******************************************
*
* @CLASS:ImageService
* @DESCRIPTION:
* @AUTHOR:hui-ye
* @VERSION:v1.0
* @DATE:2013-5-21 下午3:30:41
*******************************************/
public class ImageService {
private Context context;
public ImageService(Context context) {
this.context = context;
}
/**
* @description:通過contentprovider獲得sd卡上的圖片
* @author:hui-ye
* @return:void
*/
public List<HashMap<String, String>> getImages() {
// 指定要查詢的uri資源
Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
// 獲取ContentResolver
ContentResolver contentResolver = context.getContentResolver();
// 查詢的字段
String[] projection = { MediaStore.Images.Media._ID,
MediaStore.Images.Media.DISPLAY_NAME,
MediaStore.Images.Media.DATA, MediaStore.Images.Media.SIZE };
// 條件
String selection = MediaStore.Images.Media.MIME_TYPE + "=?";
// 條件值(這裡的參數不是圖片的格式,而是標准,所有不要改動)
String[] selectionArgs = { "image/jpeg" };
// 排序
String sortOrder = MediaStore.Images.Media.DATE_MODIFIED + " desc";
// 查詢sd卡上的圖片
Cursor cursor = contentResolver.query(uri, projection, selection,
selectionArgs, sortOrder);
List<HashMap<String, String>> imageList = new ArrayList<HashMap<String, String>>();
if (cursor != null) {
HashMap<String, String> imageMap = null;
cursor.moveToFirst();
while (cursor.moveToNext()) {
imageMap = new HashMap<String, String>();
// 獲得圖片的id
imageMap.put("imageID", cursor.getString(cursor
.getColumnIndex(MediaStore.Images.Media._ID)));
// 獲得圖片顯示的名稱
imageMap.put("imageName", cursor.getString(cursor
.getColumnIndex(MediaStore.Images.Media.DISPLAY_NAME)));
// 獲得圖片的信息
imageMap.put(
"imageInfo",
""
+ cursor.getLong(cursor
.getColumnIndex(MediaStore.Images.Media.SIZE) / 1024)
+ "kb");
// 獲得圖片所在的路徑(可以使用路徑構建URI)
imageMap.put("data", cursor.getString(cursor
.getColumnIndex(MediaStore.Images.Media.DATA)));
imageList.add(imageMap);
}
// 關閉cursor
cursor.close();
}
return imageList;
}
}
我們將圖片信息全部放入到一個List<Map>中。
再下一步:
在activity中調用service獲得List<Map>,並用自定義的適配器顯示在listview中
[html] view plaincopyprint?
package com.image.imageview;
import java.util.HashMap;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import com.image.service.ImageService;
public class MainActivity extends Activity {
private ImageService imageService;
private List<HashMap<String, String>> images;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageService = new ImageService(this);
allScan();
// 獲得所有的圖片
images = imageService.getImages();
if (images.size() > 0) {
// 將所有的圖片顯示在listview中
ListView listview = (ListView) this.findViewById(R.id.listview);
Myadapter adapter = new Myadapter(this);
listview.setAdapter(adapter);
} else {
Toast.makeText(this, R.string.no_image, 1).show();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
// 必須在查找前進行全盤的掃描,否則新加入的圖片是無法得到顯示的(加入對sd卡操作的權限)
public void allScan() {
sendBroadcast(new Intent(
Intent.ACTION_MEDIA_MOUNTED,
Uri.parse("file://" + Environment.getExternalStorageDirectory())));
}
/**
* @CLASS:Myadapter
* @DESCRIPTION:一個自定義的適配器
* @AUTHOR:hui-ye
* @VERSION:v1.0
* @DATE:2013-5-27 上午9:08:43
*/
class Myadapter extends BaseAdapter {
private LayoutInflater inflater;
public Myadapter(Context context) {
this.inflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return images.size();
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View view, ViewGroup parent) {
ViewHolder holder = null;
if (view == null) {
holder = new ViewHolder();
// 獲取行布局,對行布局中的控件進行設置賦值
view = inflater.inflate(R.layout.item, null);
holder.imageName = (TextView) view.findViewById(R.id.name);
holder.imageInfo = (TextView) view.findViewById(R.id.size);
holder.image = (ImageView) view.findViewById(R.id.image);
view.setTag(holder);
} else {
holder = (ViewHolder) view.getTag();
}
holder.imageName.setText(images.get(position).get("imageName"));
holder.imageInfo.setText(images.get(position).get("imageInfo"));
String path = images.get(position).get("data");
// 注意這裡uri的使用,可以直接使用uri地址來構建一個image圖片
Uri uri = Uri.parse(path);
// 給imageview設置圖片
holder.image.setImageURI(uri);
return view;
}
}
class ViewHolder {
private TextView imageName;
private TextView imageInfo;
private ImageView image;
}
}
package com.image.imageview;
import java.util.HashMap;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import com.image.service.ImageService;
public class MainActivity extends Activity {
private ImageService imageService;
private List<HashMap<String, String>> images;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageService = new ImageService(this);
allScan();
// 獲得所有的圖片
images = imageService.getImages();
if (images.size() > 0) {
// 將所有的圖片顯示在listview中
ListView listview = (ListView) this.findViewById(R.id.listview);
Myadapter adapter = new Myadapter(this);
listview.setAdapter(adapter);
} else {
Toast.makeText(this, R.string.no_image, 1).show();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
// 必須在查找前進行全盤的掃描,否則新加入的圖片是無法得到顯示的(加入對sd卡操作的權限)
public void allScan() {
sendBroadcast(new Intent(
Intent.ACTION_MEDIA_MOUNTED,
Uri.parse("file://" + Environment.getExternalStorageDirectory())));
}
/**
* @CLASS:Myadapter
* @DESCRIPTION:一個自定義的適配器
* @AUTHOR:hui-ye
* @VERSION:v1.0
* @DATE:2013-5-27 上午9:08:43
*/
class Myadapter extends BaseAdapter {
private LayoutInflater inflater;
public Myadapter(Context context) {
this.inflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return images.size();
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View view, ViewGroup parent) {
ViewHolder holder = null;
if (view == null) {
holder = new ViewHolder();
// 獲取行布局,對行布局中的控件進行設置賦值
view = inflater.inflate(R.layout.item, null);
holder.imageName = (TextView) view.findViewById(R.id.name);
holder.imageInfo = (TextView) view.findViewById(R.id.size);
holder.image = (ImageView) view.findViewById(R.id.image);
view.setTag(holder);
} else {
holder = (ViewHolder) view.getTag();
}
holder.imageName.setText(images.get(position).get("imageName"));
holder.imageInfo.setText(images.get(position).get("imageInfo"));
String path = images.get(position).get("data");
// 注意這裡uri的使用,可以直接使用uri地址來構建一個image圖片
Uri uri = Uri.parse(path);
// 給imageview設置圖片
holder.image.setImageURI(uri);
return view;
}
}
class ViewHolder {
private TextView imageName;
private TextView imageInfo;
private ImageView image;
}
}
最後貼出主頁面布局文件[html] view plaincopyprint?
<LinearLayout 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:orientation="vertical"
tools:context=".MainActivity" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/imagename" />
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/imageinfo" />
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/image" />
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<ListView
android:id="@+id/listview"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</LinearLayout>
</LinearLayout>
<LinearLayout 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:orientation="vertical"
tools:context=".MainActivity" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/imagename" />
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/imageinfo" />
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/image" />
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<ListView
android:id="@+id/listview"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</LinearLayout>
</LinearLayout>
listview的行布局文件
[html] view plaincopyprint?
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="20dp"
android:orientation="horizontal"
>
<TextView
android:id="@+id/name"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:maxLines="1"
android:layout_weight="1"
android:ellipsize="end"/>
<TextView
android:id="@+id/size"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:maxLines="1"
android:layout_weight="1"
/>
<ImageView
android:id="@+id/image"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
/>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="20dp"
android:orientation="horizontal"
>
<TextView
android:id="@+id/name"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:maxLines="1"
android:layout_weight="1"
android:ellipsize="end"/>
<TextView
android:id="@+id/size"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:maxLines="1"
android:layout_weight="1"
/>
<ImageView
android:id="@+id/image"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
/>
</LinearLayout>
至此完成。重點還是在ContentPrivider的使用,和listview的適配器的生成,圖片的顯示直接使用image.setImageURI(uri);上
1、頁面初始化在app開發中,若要使用HTML5+擴展api,必須等plusready事件發生後才能正常使用,mui將該事件封裝成了mui.plusReady()方法,涉
今天我們終於可以把這個項目給結束掉啦,有了前幾天的准備,相信最後一天還是比較輕松的,國際慣例: 最後要完成的就是我們的主要功能--拼圖界面。package com.x
首先來看下面的效果: 從上面的圖片可以看到,當添加多張圖片的時候,能夠在下方形成一個畫廊的效果,我們左右拉動圖片來看我們添加進去的圖片,效果是不是好了很多呢?下面來看
努比亞 Z5S MiniROOT後哪些文件可以刪除的。很多時候,我們手機進行root就是為了減輕手機中的負擔,刪除一些不必要的文件,可很多時候,我們不知道專