بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ

ارورر در پروژه ماركت اندرويد + قسمت بارگذاري عكس(حل شد )

مدیریت گفتگو
sadra 11 سال پیش
آخرین تغییر: 11 سال پیش

سلام به همگي

من همه چيزو مطابق چيزي كه استاد گفته انجام دادم.(فصل 16 ماركت اندرويد - قسمت آخر 4 ) اما صلا عمل دانلود رو انجام نميده! و توي فايل temp من هيچي نيست!

اينم خطايي كه ميده:

 08-11 07:38:57.520: W/System.err(30862): java.io.FileNotFoundException: /mnt/sdcard/web-magazine/temp/img/image3.jpg:
open failed: ENOENT (No such file or directory)

اگه خواستين تمام كدهارو ميزارم كه ببينيد، اما الالحصاب:

//---------------------------------------------------------- AdapterMag: ----------------------------------------------------------
package web_mag;

import java.io.File;
import java.util.ArrayList;

import com.itnegar.app.doctorjibi.R;

import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;


public class AdapterMag extends ArrayAdapter<StructMag> {

//moshakhas kardane adaptor
public AdapterMag(ArrayList<StructMag> array) {
super(G.context, R.layout.web_magpost_row, array);
}


//negah daranade va moshakhas konandeye controlha
private static class ViewHolder {

public ViewGroup layoutRoot;
public TextView maglist_title;
public TextView maglist_desc;
public ImageView maglist_img;


//negahdarande
public ViewHolder(View view) {
maglist_title = (TextView) view.findViewById(R.id.maglist_title);
maglist_desc = (TextView) view.findViewById(R.id.maglist_desc);
layoutRoot = (ViewGroup) view.findViewById(R.id.layoutRoot);
maglist_img = (ImageView) view.findViewById(R.id.maglist_img);
}


//por konande
public void fill(final ArrayAdapter<StructMag> adapter, final StructMag item, final int position) {
maglist_title.setText(item.title);
maglist_desc.setText(item.description);


String filename = item.logoUrl.replace("/img/", "");
final File imageFile = new File(G.DIR_FINAL + "/" + filename);
if ( !imageFile.exists()) {
maglist_img.setImageBitmap(null);
DownloadManager.addToDownloadList(item.logoUrl);
}

BitmapFactory.Options options = new BitmapFactory.Options();
//options.inSampleSize = 8;
Bitmap bitmap = BitmapFactory.decodeFile(imageFile.getAbsolutePath(), options);
maglist_img.setImageBitmap(bitmap);


//raftan be activitiye badi pas az click ruye harkodam az anasor
layoutRoot.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
G.selectedPost = item;
Intent intent = new Intent(G.currentActivity, Magazine_postdetails.class);
G.currentActivity.startActivity(intent);
}
});


}

}


//daryaft konandeye etela'at az arraye
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;

StructMag item = getItem(position);
if (convertView == null) {
convertView = G.inflater.inflate(R.layout.web_magpost_row, parent, false);
holder = new ViewHolder(convertView);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}

holder.fill(this, item, position);

Animation anim = AnimationUtils.loadAnimation(G.currentActivity, R.anim.animation);
convertView.setAnimation(anim);

return convertView;
}
}

//----------------------------------------------------------  DownloadManager: ----------------------------------------------------------
package web_mag;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import android.util.Log;


public class DownloadManager {

public static ArrayList<String> urls = new ArrayList<String>();

public static OnDownloadCompleteListener downloadCompleteListener;


public static void copyFile(String sourceFile, String destinationFile) {
FileInputStream inputStream = null;
FileOutputStream outputStream = null;
try {
inputStream = new FileInputStream(sourceFile);
outputStream = new FileOutputStream(destinationFile);

byte[] buffer = new byte[G.DOWNLOAD_BUFFER_SIZE];
int len;
while ((len = inputStream.read(buffer)) > 0) {
outputStream.write(buffer, 0, len);
}
}
catch (FileNotFoundException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
} finally {
if (inputStream != null) {
try {
inputStream.close();
}
catch (IOException e) {
e.printStackTrace();
}
}

if (outputStream != null) {
try {
outputStream.flush();
outputStream.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
}
}


public static void initialize() {
downloadCompleteListener = new OnDownloadCompleteListener() {

@Override
public void onDownloadComplete(String url, String localPath) {
Log.i("LOG", "Image Download Complete, Original URL: " + url + ", Save Path: " + localPath);
copyFile(localPath, localPath.replace("/temp/", "/final/"));
new File(localPath).delete();

}
};
}


public static void addToDownloadList(String url) {
if (urls.contains(url)) {
return;
}

String filename = url.replace("/img/", "");
filename = filename.replace("/image/", "");

if (new File(G.DIR_FINAL + "/" + filename).exists()) {
return;
}

urls.add(url);

DownloadRequest downloadRequest = new DownloadRequest()
.downloadPath("http://192.168.1.4/drjibi_adc/phptest/" + url)
.filepath(G.DIR_TEMP + "/" + filename)
.listener(downloadCompleteListener)
.download();

}
}

//----------------------------------------------------------  DownloadRequest: ----------------------------------------------------------
package web_mag;

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


public class DownloadRequest {

private int downloadedSize;
private int totalSize;
private int percent;


public int getDownloadedSize() {
return downloadedSize;
}


public int getTotalSize() {
return totalSize;
}


public int getPercent() {
return percent;
}


public DownloadRequest download() {
Thread thread = new Thread(new Runnable() {

@Override
public void run() {
try {
URL url = new URL(downloadPath);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setDoOutput(true);
connection.connect();

totalSize = connection.getContentLength();

File file = new File(filepath);
if (file.exists()) {
file.delete();
}

FileOutputStream outputStream = new FileOutputStream(filepath);

InputStream inputStream = connection.getInputStream();
byte[] buffer = new byte[G.DOWNLOAD_BUFFER_SIZE];
int len = 0;
while ((len = inputStream.read(buffer)) > 0) {
outputStream.write(buffer, 0, len);
downloadedSize += len;

percent = (int) (100.0f * (float) downloadedSize / totalSize);
if (percent == 100 && listener != null) {

G.HANDLER.post(new Runnable() {

@Override
public void run() {
listener.onDownloadComplete(downloadPath, filepath);
}
});
}

if (simulate) {
try {
Thread.sleep(100);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}

outputStream.close();
}
catch (MalformedURLException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
}
});

thread.start();

return this;
}

private String downloadPath;
private String filepath;
private OnDownloadCompleteListener listener;
private boolean simulate;


public DownloadRequest downloadPath(String value) {
downloadPath = value;
return this;
}


public DownloadRequest filepath(String value) {
filepath = value;
return this;
}


public DownloadRequest listener(OnDownloadCompleteListener value) {
listener = value;
return this;
}


public DownloadRequest simulate(boolean value) {
simulate = value;
return this;
}
}

//------------------------------------------------------ .G: ----------------------------------------------------------
package web_mag;

import java.io.File;

import android.app.Application;
import android.content.Context;
import android.os.Environment;
import android.os.Handler;
import android.support.v7.app.ActionBarActivity;
import android.view.LayoutInflater;

public class G extends Application{

public static Context context;
public static LayoutInflater inflater;
public static final Handler HANDLER = new Handler();
public static ActionBarActivity currentActivity;
public static final int DOWNLOAD_BUFFER_SIZE = 8 * 1024;


public static final String DIR_SDCARD = Environment.getExternalStorageDirectory().getAbsolutePath();
public static final String DIR_APP = DIR_SDCARD + "/web-magazine";
public static final String DIR_TEMP = DIR_APP + "/temp";
public static final String DIR_FINAL = DIR_APP + "/final";


public static StructMag selectedPost;

@Override
public void onCreate() {
super.onCreate();

context = getApplicationContext();
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

new File(DIR_APP).mkdirs();
new File(DIR_TEMP).mkdirs();
new File(DIR_FINAL).mkdirs();

DownloadManager.initialize();

}

}

 //------------------------------------------------------ Magazinepost: ----------------------------------------------------------
package web_mag;

import java.util.ArrayList;

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import com.itnegar.app.doctorjibi.R;

import android.os.Bundle;
import android.os.StrictMode;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.widget.ListView;

public class Magazine_post extends EnhancedActivity{

private ListView list;
private AdapterMag adapter;

private ArrayList<StructMag> magPost = new ArrayList<StructMag>();

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.web_magpost_layout);

//ejaze gereftan jahate ersal va daryafte dadeh tavasote JSON
StrictMode.ThreadPolicy policy= new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
//-----------------------------------------------------------

list = (ListView) findViewById(R.id.maglist_list);

adapter = new AdapterMag(magPost);
list.setAdapter(adapter);

populateFromServer();
}


private void fakedata(){
for(int i=0; i<50; i++){
StructMag magPosts = new StructMag();
magPosts.title="اپليكيشن #"+i;
magPosts.description="متن اپليكيشن #"+i;

magPost.add(magPosts);
}

adapter.notifyDataSetChanged();
}


private void populateFromServer() {

String result = Webservice.readUrl("http://192.168.1.4/drjibi_adc/phptest/index.php?action=read", null);
Log.i("stringgggggggg", result);
if (result != null) {
try {
magPost.clear();
JSONArray posts = new JSONArray(result);
for (int i = 0; i < posts.length(); i++) {

JSONObject object = posts.getJSONObject(i);
StructMag magPosts = new StructMag();

magPosts.title = object.getString("title");
magPosts.description = object.getString("content");
magPosts.logoUrl = object.getString("logo_url");

magPost.add(magPosts);
}

adapter.notifyDataSetChanged();

}catch (JSONException e) {e.printStackTrace();}

}

}

}

نظرات

sadra 11 سال پیش
لطفا آقاي آقاجاني پاسخ بدند. ممنون
Ali 11 سال پیش
آقا صدرا شما 30 دقیقه پیش این سوال رو پرسیدید و اصلا شاید استاد و مدیرای سایت توی این 30 دقیقه آفلاین بودند! درضمن من قبلا از این چیزی که استاد نوشته بودند و یاد داده بودند استفاده کردم و این مشکلی که شما میگید رو هیچ وقت نداشتم. راستی اگه میخواید یه سری عکس رو از سرور بگیرید و نمایش بدید به نظر من بهترین کار استفاده از universal Image Loader هست.
قندروید 11 سال پیش
به نظرم مشکل از قسمت download Manger باشه. میخوای اینطوری که میگم هم امتحان کن: داخل متود initialize اون قسمتی که داری replace میکنی رو جداگونه بنویس و بعدن کپی رو انجام بده.امکان داره اینجور نوشتن تداخل ایجاد کنه...
sadra 11 سال پیش
مشكل اينه كه اصلا دانلود انجام نميشه!!!! يعني اصلا حتي فايلي توي temp ايجان نميشه
قندروید 11 سال پیش
این کدهایی که گذاشتی به نظرم برای قسمت دانلود کردن و درخواست دانلود جواب میده؛ منتها ممکنه تو آدرس دهی یه اشتباهاتی وجود داشته باشه... نمیتونم دقیقن بگم مشکلش چیه اما به نظرم مشکل از جایی که کپی میکنی و بعد delete میکنی آب میخوره؛ با log کردن ببین کاری که مد نظرت هست رو انجام میده یا نه. که حداقل از این مورد مطمئن باشی.
sadra 11 سال پیش
اينكارو كردم، همونطور كه در پست زير نشون دادم، از اونجا به بعد كار نميكنه و لاگ نميندازه
Criss 11 سال پیش
مشکل شما که مشخصه داره میگه mnt/sdcard/web-magazine/temp/img/ وجود نداره < من کلاس G شما رو نگاه کردم این آدرس رو از قبل نساختید < و فقط App_DIR و final , temp رو ساختید
Criss 11 سال پیش
پیشنهاد میکنم < یک لاگ از filepath در کلاس Downloader خودتون بگیرید < مطمئن بشید که مسیر درست هست
sadra 11 سال پیش
خاک به سرم! چرا نوشته، temp/img ????? اصن حواسم نبود!!!! چیکار کنم بشه temp خالی؟؟ img رو کجا گذاشتم، لطف کنید راهنمایی کنید کجا اشتباه کردم درست شه.
Criss 11 سال پیش
مشکل میتونه از addToDownloadList باشه < با اینکه ظاهرا درست هست < اما لاگ بگیرید < تا متوجه بشید
sadra 11 سال پیش
ممنون كريس جان، مشكل حل شد، توي ديتابيس آدرس عكس بود "img/image3.jpg" اما توي كد گفته بودكه كه "/img/" رو رپليس كن، در صورتي كه بايد ميگفتم "img/" رو ريپليس كن. ممنون از همه. ببخشيد سرتون رو درد آوردم.

پاسخ‌ها 1

sadra 11 سال پیش

طبق لاگ هايي كه گرفتم، اين اينجا به بعد كار نميكنه و لاگ نميندازه:

 //----------------------------------------------------------  DownloadRequest: ----------------------------------------------------------
package web_mag;

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


publicclassDownloadRequest{

privateint downloadedSize;
privateint totalSize;
privateint percent;


publicint getDownloadedSize(){
return downloadedSize;
}


publicint getTotalSize(){
return totalSize;
}


publicint getPercent(){
return percent;
}


publicDownloadRequest download(){
Thread thread =newThread(newRunnable(){

@Override
publicvoid run(){
try{
URL url =new URL(downloadPath);
HttpURLConnection connection =(HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setDoOutput(true);
connection.connect();

totalSize = connection.getContentLength();

File file =newFile(filepath);
if(file.exists()){
file.delete();
}


///////////////////////////////////////////////////// از اينجا به بعد كار نميكنه ////////////////////////////////////////////////////////////////
FileOutputStream outputStream =newFileOutputStream(filepath);

InputStream inputStream = connection.getInputStream();
byte[] buffer =newbyte[G.DOWNLOAD_BUFFER_SIZE];
int len =0;
while((len = inputStream.read(buffer))>0){
outputStream.write(buffer,0, len);
downloadedSize += len;

percent =(int)(100.0f*(float) downloadedSize / totalSize);
if(percent ==100&& listener !=null){

G.HANDLER.post(newRunnable(){

@Override
publicvoid run(){
listener.onDownloadComplete(downloadPath, filepath);
}
});
}

if(simulate){
try{
Thread.sleep(100);
}
catch(InterruptedException e){
e.printStackTrace();
}
}
}

outputStream.close();
}
catch(MalformedURLException e){
e.printStackTrace();
}
catch(IOException e){
e.printStackTrace();
}
}
});

thread.start();

returnthis;
}

privateString downloadPath;
privateString filepath;
privateOnDownloadCompleteListener listener;
privateboolean simulate;


publicDownloadRequest downloadPath(String value){
downloadPath = value;
returnthis;
}


publicDownloadRequest filepath(String value){
filepath = value;
returnthis;
}


publicDownloadRequest listener(OnDownloadCompleteListener value){
listener = value;
returnthis;
}


publicDownloadRequest simulate(boolean value){
simulate = value;
returnthis;
}
}

نظرات

قندروید 11 سال پیش
از اون قسمت به بعد، برنامت کرش هم میکنه؟ اشتباه نمیکنی؟ آخه قبل از اون قسمت که نه return داریم و نه همچین چیزی که از کد بیاد بیرون که! دلیلی نداره که دیگه log چاپ نشه! اگه قبلش (داخل if) چاپ کنه؛ باید از if به بعد؛ و اونجایی که outputStream رو هم میسازی باید چاپ کنه.
sadra 11 سال پیش
دقيقا تا قبل onputstream همه چي رو اجرا ميكنه، از onPutStream به بعد هيچي اجرا نميشه نه لاگي نه چيزي!
sadra 11 سال پیش
الان كه چك كردم، از همون كرش ميكنه و مياد catch (IOException e) { e.printStackTrace();} اجرا ميكنه، يعني آخرين catch رو
sadra 11 سال پیش
لاگ آخرين ctach هم ميگه كه: 08-11 09:19:13.281: I/stringgggggggg(8724): java.io.FileNotFoundException: /mnt/sdcard/web-magazine/temp/img/image3.jpg: open failed: ENOENT (No such file or directory)k
sadra 11 سال پیش
البته 3تا عكسه، واسه هر سته image1 image2 image3 همينو ميگه

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .