서버에 저장된 사진 파일을 가져와 coverFlow형태로 띄우는 겁니다
로그캣 에러는 널포인트 에러인데 소스 코드에서 어떤부분을 어떤식으로 바꾸어야할지 감을 못잡겠습니다.
고수님들 좀 도와주세여 ㅜ.ㅜ
10-19 07:46:15.110: ERROR/AndroidRuntime(402): at com.ireal.sc.Gallery2Activity$ImageAdapter.getCount(Gallery2Activity.java:292)
10-19 07:59:27.100: ERROR/AndroidRuntime(429): FATAL EXCEPTION: main
10-19 07:59:27.100: ERROR/AndroidRuntime(429): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.ireal.sc/com.ireal.sc.Gallery2Activity}: java.lang.NullPointerException
10-19 07:59:27.100: ERROR/AndroidRuntime(429): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
10-19 07:59:27.100: ERROR/AndroidRuntime(429): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
10-19 07:59:27.100: ERROR/AndroidRuntime(429): at android.app.ActivityThread.access$2300(ActivityThread.java:125)
10-19 07:59:27.100: ERROR/AndroidRuntime(429): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
10-19 07:59:27.100: ERROR/AndroidRuntime(429): at android.os.Handler.dispatchMessage(Handler.java:99)
10-19 07:59:27.100: ERROR/AndroidRuntime(429): at android.os.Looper.loop(Looper.java:123)
10-19 07:59:27.100: ERROR/AndroidRuntime(429): at android.app.ActivityThread.main(ActivityThread.java:4627)
10-19 07:59:27.100: ERROR/AndroidRuntime(429): at java.lang.reflect.Method.invokeNative(Native Method)
10-19 07:59:27.100: ERROR/AndroidRuntime(429): at java.lang.reflect.Method.invoke(Method.java:521)
10-19 07:59:27.100: ERROR/AndroidRuntime(429): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
10-19 07:59:27.100: ERROR/AndroidRuntime(429): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
10-19 07:59:27.100: ERROR/AndroidRuntime(429): at dalvik.system.NativeStart.main(Native Method)
10-19 07:59:27.100: ERROR/AndroidRuntime(429): Caused by: java.lang.NullPointerException
10-19 07:59:27.100: ERROR/AndroidRuntime(429): at com.ireal.sc.Gallery2Activity$ImageAdapter.getCount(Gallery2Activity.java:293)
10-19 07:59:27.100: ERROR/AndroidRuntime(429): at com.ireal.sc.CoverAbsSpinner.setAdapter(CoverAbsSpinner.java:119)
10-19 07:59:27.100: ERROR/AndroidRuntime(429): at com.ireal.sc.Gallery2Activity.onCreate(Gallery2Activity.java:75)
10-19 07:59:27.100: ERROR/AndroidRuntime(429): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
10-19 07:59:27.100: ERROR/AndroidRuntime(429): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
10-19 07:59:27.100: ERROR/AndroidRuntime(429): ... 11 more
소스코드
package com.ireal.sc;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import org.apache.http.util.ByteArrayBuffer;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.LinearGradient;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PorterDuffXfermode;
import android.graphics.Bitmap.Config;
import android.graphics.PorterDuff.Mode;
import android.graphics.Shader.TileMode;
import android.net.ConnectivityManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ImageView.ScaleType;
import com.ireal.SC;
import com.ireal.log.Logger;
import com.ireal.xml.Node;
import com.ireal.xml.kXML2Parser;
public class Gallery2Activity extends Activity {
private static final Gallery Gallery = null;
private ProgressDialog progressDialog;
final private int PROGRESS_DIALOG = 0;
private boolean flag = false;
private Context mContext;
private Handler handler = new Handler();
private ImageAdapter coverImageAdapter ;
ArrayList<Gallery> mList;
private ImageView[] mImages;
private FileInputStream fis;
int mGalleryItemBackground;
@Override
public void onCreate(Bundle savedInstanceState)
{
requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
CoverFlow coverFlow;
coverFlow = new CoverFlow(this);
coverFlow.setAdapter(new ImageAdapter(this));
coverImageAdapter.createReflectedImages();
coverFlow.setSpacing(-15);
coverFlow.setSelection(4, true);
setContentView(coverFlow);
mContext = this;
Thread thread = new Thread(null, init);
thread.start();
showDialog(PROGRESS_DIALOG);
if(flag == true){
}
}
private Runnable init = new Runnable() {
int mResponseCode;
@Override
public void run() {
getGalleryList();
}
};
private void getGalleryList(){
FileInputStream in = null;
URL url;
URLConnection urlConn = null;
InputStream is = null;
String strXML = new String();
StringBuffer sb = new StringBuffer();
int mResponseCode;
mList = new ArrayList<Gallery>();
mImages = new ImageView[mList.size()];
ConnectivityManager manager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
// 3G 를 사용하는지 확인힌다.
boolean is3g = manager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).isConnectedOrConnecting();
// WIFI 를 사용하는지 확인한다.
boolean isWifi = manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).isConnectedOrConnecting();
// 3G 와 WIFI 중 어떤 네트워크를 사용하지는 화면에 보여준다.
if(is3g || isWifi){
wifi3g.sendEmptyMessage(0);
try{
url = new URL("http://"+SC.SERVER_ADDRESS+"/gallery.action?pages=get.gallery.list");
urlConn = url.openConnection();
HttpURLConnection huc = (HttpURLConnection)urlConn;
huc.setReadTimeout(1500);
mResponseCode = huc.getResponseCode();
if(mResponseCode != HttpURLConnection.HTTP_OK){
disconnectedHandler.sendEmptyMessage(0);
}
is = urlConn.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
if(br != null){
sb.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");
while((strXML = br.readLine())!= null){
sb.append(strXML);
}
}
if(sb.length() > 0){
Node node = new kXML2Parser().parse(sb.toString());
Gallery gallery;
for(int i = 0 ; i<node.getNNodes();i++){
Node n = node.getNode(i);
if(n.getName().equals("gallery")){
gallery = new Gallery();
for(int j = 0 ; j<n.getNNodes();j++){
Node nn = n.getNode(j);
if (nn.getName().equals("title")) {
gallery.setTitle(nn.getValue());
}else if (nn.getName().equals("url")) {
gallery.setUrl(nn.getValue());
File file = new File(SC.DIR_PATH+"/"+gallery.getUrl());
if(!file.exists()){
URL urls = new URL("http://"+SC.SERVER_ADDRESS+"/files/gallery/"+gallery.getUrl());
URLConnection ucon = urls.openConnection();
BufferedInputStream bis = new BufferedInputStream(ucon.getInputStream());
ByteArrayBuffer baf = new ByteArrayBuffer(50);
int current = 0;
while ((current = bis.read()) != -1) {
baf.append((byte) current);
}
FileOutputStream fos = new FileOutputStream(file);
fos.write(baf.toByteArray());
fos.close();
bis.close();
}else{
Logger.debug(gallery.getUrl() + " is exists");
}
}
}
mList.add(Gallery);
}
}
flag=true;
}
if(flag == true){
Logger.debug("true");
}
}catch(Exception e){
Logger.error(e);
finish();
} finally{
Logger.debug("Thread finally");
if(is != null) try {is.close();} catch (Exception e) {}
}
}else{
no_wifi3g.sendEmptyMessage(0);
// Toast.makeText(Gallery2Activity.this, "3g wifi 사용안함", Toast.LENGTH_SHORT).show();
File file= new File(SC.DIR_PATH);
File[] listFile = file.listFiles();
for(File tempList:listFile){
if(tempList.getName().startsWith("gallery") && tempList.getName().endsWith(".jpg")){
Gallery gallery = new Gallery();
gallery.setUrl(tempList.getName());
mList.add(Gallery);
}
}
}
}
private Handler disconnectedHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
Logger.debug("disconnectionHandler : "+msg.toString());
Toast.makeText(Gallery2Activity.this, "네트워크를 확인 하세요.", Toast.LENGTH_LONG).show();
}
};
private Handler no_wifi3g = new Handler(){
@Override
public void handleMessage(Message msg) {
Logger.debug("no_wifi3g : "+msg.toString());
}
};
private Handler wifi3g = new Handler(){
@Override
public void handleMessage(Message msg) {
Logger.debug("wifi3g : "+msg.toString());
}
};
private class ImageAdapter extends BaseAdapter
{
ImageAdapter(Context c)
{
Logger.debug("ImageAdapter()");
mContext = c;
}
// 이미지 클릭 시 전체 화면으로 이동
/*public final void callImageViewer(int selectedIndex){
Intent i = new Intent(mContext, GalleryDetailActivity.class);
String imgPath = mList.get(selectedIndex).getUrl();
i.putExtra("filename", imgPath);
ArrayList<String> imgPaths = new ArrayList<String>();
for(int a = 0;a<mList.size();a++)
{
imgPaths.add(mList.get(a).getUrl());
}
i.putStringArrayListExtra("gallery", imgPaths);
startActivityForResult(i, 1);
}*/
public boolean deleteSelected(int index){
return true;
}
public boolean createReflectedImages()
{
final int reflectionGap = 4;
int index = 0;
for (;;)
{
Bitmap originalImage = BitmapFactory.decodeResource(getResources(),100);
int width = originalImage.getWidth();
int height = originalImage.getHeight();
Matrix matrix = new Matrix();
matrix.preScale(1, -1);
Bitmap reflectionImage = Bitmap.createBitmap(originalImage, 0, height/2, width, height/2, matrix, false);
Bitmap bitmapWithReflection = Bitmap.createBitmap(width , (height + height/2), Config.ARGB_8888);
Canvas canvas = new Canvas(bitmapWithReflection);
canvas.drawBitmap(originalImage, 0, 0, null);
Paint deafaultPaint = new Paint();
canvas.drawRect(0, height, width, height + reflectionGap, deafaultPaint);
canvas.drawBitmap(reflectionImage,0, height + reflectionGap, null);
Paint paint = new Paint();
LinearGradient shader = new LinearGradient(0, originalImage.getHeight(), 0,
bitmapWithReflection.getHeight() + reflectionGap, 0x70ffffff, 0x00ffffff,
TileMode.CLAMP);
paint.setShader(shader);
paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));
canvas.drawRect(0, height, width,
bitmapWithReflection.getHeight() + reflectionGap, paint);
ImageView imageView = new ImageView(mContext);
imageView.setImageBitmap(bitmapWithReflection);
imageView.setLayoutParams(new CoverFlow.LayoutParams(310, 380));
imageView.setScaleType(ScaleType.MATRIX);
mImages[index++] = imageView;
}
//return true;
}
public int getCount()
{
return mList.size();
}
public Object getItem(int position){
return position;
}
public long getItemId(int position){
return position;
}
public View getView(int position, View convertView, ViewGroup parent)
{
return mImages[position];
}
public float getScale(boolean focused, int offset)
{
return Math.max(0, 1.0f / (float)Math.pow(2, Math.abs(offset)));
}
}
// Menu Button Function
@Override
public void onConfigurationChanged(Configuration newConfig){
super.onConfigurationChanged(newConfig);
}
@Override
public boolean onCreateOptionsMenu(Menu menu){
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.gallery_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item){
switch(item.getItemId()){
case R.id.gallery_update: // gallery list update
getGalleryList();
return true;
default :
return super.onOptionsItemSelected(item);
}
}
private class Gallery{
private String no;
private String title;
private String url;
public String getNo(){
return no;
}
public void setNo(String no){
this.no = no;
}
public String getTitle(){
return title;
}
public void setTitle(String title){
this.title = title;
}
public String getUrl(){
return url;
}
public void setUrl(String url){
this.url = url;
}
}
//다이얼로그
protected Dialog onCreateDialog(int id) {
progressDialog = new ProgressDialog(this);
progressDialog.setMessage("캠퍼스 포토 Loading...... ");
progressDialog.setIndeterminate(true);
progressDialog.setCancelable(true);
progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
return progressDialog;
}
@Override
protected void onPrepareDialog(int id, Dialog dialog) {
// TODO Auto-generated method stub
switch (id) {
case (PROGRESS_DIALOG):
AlertDialog mItemDialog = (AlertDialog) dialog;
mItemDialog.setTitle("Loading......");
break;
}
}
}