问题描述:该程序可以在模拟器上正常运行,但移植到真机上就出问题了。
代码:在此只贴出部分重要代码
package com.mgear.camera;
import java.io.File;
import java.util.ArrayList;
import java.util.List;import com.mgear.pharos.R;import android.os.Environment;import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
public class GridViewTest extends Activity{
private File[] files;
private List<String> pathsrcs; @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.sdcard);
GridView gridview = (GridView) findViewById(R.id.sdcard);
File f=android.os.Environment.getExternalStorageDirectory();
// files=new File(f.getPath()+"/mypic"+File.separator).listFiles();
// showAlert(f.getPath()+"#####");
// files=new File(f.getPath()+"/DCIM/Camera"+File.separator).listFiles();
//files=new File("/sdcard/DCIM/Camera/").listFiles();
files=new File("/sdcard/").listFiles();
pathsrcs = new ArrayList<String>();
for (File file : files){
String path=file.getPath();
//String path=file.getAbsolutePath();
if(validate(path)){
pathsrcs.add(path);
}
}
//以下2行代码注释,就正确了。不注释报空指针,但文件明显是有滴
gridview.setAdapter(new ImageAdapter(this));
gridview.setOnItemClickListener(new gridviewItemClick());
}
class gridviewItemClick implements OnItemClickListener{
@Override
public void onItemClick(AdapterView<?> parent, View v, int position,
long id) {
// TODO Auto-generated method stub
// 此段代码可以不要
Intent intent = new Intent();
intent.putExtra("pathsrc", pathsrcs.get(position)); GridViewTest.this.setResult(0, intent);
GridViewTest.this.finish();
}
}
class ImageAdapter extends BaseAdapter {
private Context mContext; public ImageAdapter(Context c) {
mContext = c;
} public int getCount() {
return pathsrcs.size();
} public Object getItem(int position) {
return null;
} public long getItemId(int position) {
return 0;
// return position;
} public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView;
if (convertView == null) { // if it's not recycled, initialize some attributes
imageView = new ImageView(mContext);
imageView.setLayoutParams(new GridView.LayoutParams(85, 85));
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
imageView.setPadding(8, 8, 8, 8);
} else {
imageView = (ImageView) convertView;
}
String path=pathsrcs.get(position);
File file=new File(path);
if(file.exists()){
System.out.println("**"+path+"**"+position+"****"+pathsrcs.size());
Bitmap bitmap=BitmapFactory.decodeFile(path);
imageView.setImageBitmap(bitmap);
}
return imageView;
} }
private boolean validate(String fileName){
int idx = fileName.indexOf(".");
String subfix = fileName.substring(idx+1);
if(fileName.equals("")){
return false;
}
//subfix.equals()||subfix.equals(".png")||subfix.equals(".jpeg")
if("jpg".equals(subfix)){
return true;
}else{
return false;
}
}
private void showAlert(String msg){
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage(msg)
.setCancelable(false)
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
}
});
AlertDialog alert = builder.create();
alert.show();
}
}
希望各位高手帮个忙!
代码:在此只贴出部分重要代码
package com.mgear.camera;
import java.io.File;
import java.util.ArrayList;
import java.util.List;import com.mgear.pharos.R;import android.os.Environment;import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
public class GridViewTest extends Activity{
private File[] files;
private List<String> pathsrcs; @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.sdcard);
GridView gridview = (GridView) findViewById(R.id.sdcard);
File f=android.os.Environment.getExternalStorageDirectory();
// files=new File(f.getPath()+"/mypic"+File.separator).listFiles();
// showAlert(f.getPath()+"#####");
// files=new File(f.getPath()+"/DCIM/Camera"+File.separator).listFiles();
//files=new File("/sdcard/DCIM/Camera/").listFiles();
files=new File("/sdcard/").listFiles();
pathsrcs = new ArrayList<String>();
for (File file : files){
String path=file.getPath();
//String path=file.getAbsolutePath();
if(validate(path)){
pathsrcs.add(path);
}
}
//以下2行代码注释,就正确了。不注释报空指针,但文件明显是有滴
gridview.setAdapter(new ImageAdapter(this));
gridview.setOnItemClickListener(new gridviewItemClick());
}
class gridviewItemClick implements OnItemClickListener{
@Override
public void onItemClick(AdapterView<?> parent, View v, int position,
long id) {
// TODO Auto-generated method stub
// 此段代码可以不要
Intent intent = new Intent();
intent.putExtra("pathsrc", pathsrcs.get(position)); GridViewTest.this.setResult(0, intent);
GridViewTest.this.finish();
}
}
class ImageAdapter extends BaseAdapter {
private Context mContext; public ImageAdapter(Context c) {
mContext = c;
} public int getCount() {
return pathsrcs.size();
} public Object getItem(int position) {
return null;
} public long getItemId(int position) {
return 0;
// return position;
} public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView;
if (convertView == null) { // if it's not recycled, initialize some attributes
imageView = new ImageView(mContext);
imageView.setLayoutParams(new GridView.LayoutParams(85, 85));
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
imageView.setPadding(8, 8, 8, 8);
} else {
imageView = (ImageView) convertView;
}
String path=pathsrcs.get(position);
File file=new File(path);
if(file.exists()){
System.out.println("**"+path+"**"+position+"****"+pathsrcs.size());
Bitmap bitmap=BitmapFactory.decodeFile(path);
imageView.setImageBitmap(bitmap);
}
return imageView;
} }
private boolean validate(String fileName){
int idx = fileName.indexOf(".");
String subfix = fileName.substring(idx+1);
if(fileName.equals("")){
return false;
}
//subfix.equals()||subfix.equals(".png")||subfix.equals(".jpeg")
if("jpg".equals(subfix)){
return true;
}else{
return false;
}
}
private void showAlert(String msg){
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage(msg)
.setCancelable(false)
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
}
});
AlertDialog alert = builder.create();
alert.show();
}
}
希望各位高手帮个忙!
// files=new File(f.getPath()+"/mypic"+File.separator).listFiles();
// showAlert(f.getPath()+"#####");
// files=new File(f.getPath()+"/DCIM/Camera"+File.separator).listFiles();
//files=new File("/sdcard/DCIM/Camera/").listFiles();
files=new File("/sdcard/").listFiles();
pathsrcs = new ArrayList<String>();这里的f用了吗?
用不用都一样吧,路劲都是/sdcard
我也试过
* 检查移动设备是否存在SDCard
* @return true则存在<br/>
* 2010-8-9
*/
public static boolean checkSDCard() {
return (android.os.Environment.getExternalStorageState()
.equals(android.os.Environment.MEDIA_MOUNTED)) ? true : false;
}
/**
* 返回外设存储设备的根路径,如"/sdcard"
* @return 存储卡的根目录
* 2010-9-27
*/
public static String getSDCardRoot() {
return (checkSDCard()) ? android.os.Environment
.getExternalStorageDirectory().getAbsolutePath() : null;
}[[/code]可以这样方法可以取得根目录,然后读取根目录下的文件/文件夹……
具体原理还没弄清楚,希望给予解释
解决方案
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 10;
Bitmap bitmap=BitmapFactory.decodeFile(path,options);
imageView.setImageBitmap(bitmap);