2010-11-15 17 views
7

मैं जो करने की कोशिश कर रहा हूं वह यह है: मैं चाहता हूं कि मेरा एप्लिकेशन इंटरनेट से एक छवि डाउनलोड करें और इसे सहेजें उस स्थान पर फ़ोन की आंतरिक मेमोरी जो एप्लिकेशन के लिए निजी है। यदि सूची आइटम के लिए कोई छवि उपलब्ध नहीं है (यानी यह इंटरनेट पर नहीं मिल पाती है), तो मैं एक डिफ़ॉल्ट प्लेसहोल्डर छवि प्रदर्शित करना चाहता हूं। यह वह छवि है जिसे मैंने अपनी list_item_row.xml फ़ाइल में डिफ़ॉल्ट रूप से परिभाषित किया है।एंड्रॉइड - वेब से छवि डाउनलोड करना, ऐप से निजी स्थान पर आंतरिक मेमोरी में सहेजना, सूची आइटम के लिए प्रदर्शित करना

मेरी सूची एक्टिविटी फ़ाइल में, मैं लिखित कस्टम कसर एडाप्टर क्लास का एक उदाहरण बुला रहा हूं। यह कस्टमकर्स एडाप्टर में है जहां मैं सभी सूची आइटमों के माध्यम से पुनरावृत्ति कर रहा हूं और परिभाषित करता हूं कि छवियों को आंतरिक मेमोरी से पढ़ने की कोशिश करके छवियों को किस प्रकार मैप किया जाना चाहिए।

मैंने इस विषय पर कई प्रश्न देखे हैं, लेकिन उदाहरण या तो बाहरी फोन मेमोरी (जैसे एसडीकार्ड) के लिए विशिष्ट हैं, इसमें छवियों के बजाय तारों को सहेजना शामिल है, या फ़ाइल के संकल्प को कम करने के लिए बिटमैप.कंप्रेसफॉर्मैट का उपयोग करना शामिल है (जो मेरे मामले में अनावश्यक है, क्योंकि ये छवियां पहले से ही छोटे संकल्प के छोटे थंबनेल होंगे)। प्रत्येक उदाहरण से कोड को टुकड़ा करने की कोशिश करना कठिन रहा है, इसलिए मैं अपने विशिष्ट उदाहरण के बारे में पूछ रहा हूं।

फिलहाल, मेरा मानना ​​है कि मैंने वैध कोड लिखा है, लेकिन डिफ़ॉल्ट प्लेसहोल्डर छवि सहित मेरी सूची आइटमों के लिए कोई छवि प्रदर्शित नहीं हो रही है। मुझे नहीं पता कि समस्या अमान्य डाउनलोड/सेव कोड, या अमान्य पढ़ने कोड के कारण हो रही है - यह मदद नहीं करता है कि मुझे यह नहीं पता कि आंतरिक स्मृति को कैसे जांचें, यह देखने के लिए कि छवि मौजूद है या नहीं।

वैसे भी, मेरा कोड यहां है। किसी भी तरह की सहायता का स्वागत किया जाएगा।

ProductUtils.java

public static String productLookup(String productID, Context c) throws IOException { 
    URL url = new URL("http://www.samplewebsite.com/" + productID + ".jpg"); 
    URLConnection connection = url.openConnection(); 
    InputStream input = connection.getInputStream(); 
    FileOutputStream output = 
     c.openFileOutput(productID + "-thumbnail.jpg", Context.MODE_PRIVATE); 
    byte[] data = new byte[1024]; 

    output.write(data); 
    output.flush(); 
    output.close(); 
    input.close(); 
} 

CustomCursorAdapter.java

public class CustomCursorAdapter extends CursorAdapter { 
    public CustomCursorAdapter(Context context, Cursor c) { 
     super(context, c); 
    } 

    @Override 
    public void bindView(View view, Context context, Cursor cursor) { 
     ImageView thumbnail = (ImageView) view.findViewById(R.id.thumbnail); 

     String fileName = 
       cursor.getString(cursor.getColumnIndex(DbAdapter.KEY_IMAGE_FILE_PATH)); 

     Bitmap bMap = BitmapFactory.decodeFile(fileName); 
     thumbnail.setImageBitmap(bMap); 
    } 

    @Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) { 
     LayoutInflater inflater = LayoutInflater.from(context); 
     View v = inflater.inflate(R.layout.list_item_row, parent, false); 
     bindView(v, context, cursor); 
     return v; 
    } 
} 

उत्तर

2

बस छवि फ़ाइल नाम की चर्चा करते हुए जब पढ़ने के लिए यह पर्याप्त नहीं था की कोशिश कर रहा तरह लग रहा है, और मैं फ़ाइल भंडारण की राह पाने के लिए getFilesDir() कॉल करने के लिए किया था।

String path = context.getFilesDir().toString(); 
String fileName = cursor.getString(cursor.getColumnIndex(DbAdapter.KEY_PRODUCT_ID)); 

if (fileName != null && !fileName.equals("")) { 
    Bitmap bMap = BitmapFactory.decodeFile(path + "/" + fileName); 
    if (bMap != null) { 
     thumbnail.setImageBitmap(bMap); 
    } 
} 
+0

फिर मेरा प्रश्न मान्य था: "लॉग को लिखें ताकि आप सुनिश्चित हों कि आपने एक ही फाइल लिख ली है और पढ़ा है?"। – dacwe

+0

मूल रूप से, मुझे पता नहीं था कि फ़ाइल नाम से अधिक कुछ भी आवश्यक था और मैंने सोचा था कि एप्लिकेशन उस विशिष्ट पथ से स्वयं जागरूक था जहां फ़ाइल होगी। – Keeb13r

7

ऐसा लगता है कि कुछ कोड बाहर छोड़ दिया है, मैं इसे इस तरह फिर से लिखा है:

ProductUtils.java

public static String productLookup(String productID, Context c) throws IOException { 

    URL url = new URL("http://www.samplewebsite.com/" + productID + ".jpg"); 

    InputStream input = null; 
    FileOutputStream output = null; 

    try { 
     String outputName = productID + "-thumbnail.jpg"; 

     input = url.openConnection().getInputStream(); 
     output = c.openFileOutput(outputName, Context.MODE_PRIVATE); 

     int read; 
     byte[] data = new byte[1024]; 
     while ((read = input.read(data)) != -1) 
      output.write(data, 0, read); 

     return outputName; 

    } finally { 
     if (output != null) 
      output.close(); 
     if (input != null) 
      input.close(); 
    } 
} 
+0

अनुप्रयोग है कि कोड के साथ संकलन नहीं होगा: नीचे दिए गए कोड मैं प्रयोग किया जाता है। यह कहता है कि इनपुट और आउटपुट वैरिएबल को प्रारंभ करने की आवश्यकता है। मैंने "इनपुटस्ट्रीम इनपुट = नल" और "फाइलऑटपुटस्ट्रीम आउटपुट = नल" कहने के लिए समस्याग्रस्त लाइनों में सुधार किया, लेकिन मुझे अभी भी कोई छवि प्रदर्शित करने के साथ एक ही समस्या है। – Keeb13r

+0

ऐसा लगता है कि मुझे जो त्रुटि मिल रही है वह यह है: "java.io.IOException: एक निर्देशिका है"। मुझे यकीन नहीं है कि क्या सोचना चाहिए, क्योंकि मैंने सोचा था कि किसी भी हस्तक्षेप करने वाले फ़ोल्डरों को पेश किए बिना फ़ाइल नाम निर्दिष्ट करना परिणामस्वरूप लिखना और पढ़ना पथ बिल्कुल वही होगा। – Keeb13r

+0

हम, क्या उत्पाद आईडी में स्लेश ('/') होते हैं? – dacwe

-1
void writeToFile(Bitmap _bitmapScaled) 
    { 
     ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
     _bitmapScaled.compress(Bitmap.CompressFormat.PNG, 40, bytes); 
     try{ 
     File f; 
     //you can create a new file name "test.jpg" in sdcard folder. 
     if (android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)) 
      f =new File(android.os.Environment.getExternalStorageDirectory(),"FamilyLocator/userimages/"+imageName); 
     else 
     f = new File(Environment.getDataDirectory(),"FamilyLocator/userimages/"+imageName); 

     f.createNewFile(); 
     //write the bytes in file 
     FileOutputStream fo = new FileOutputStream(f); 
     fo.write(bytes.toByteArray()); 
     // remember close de FileOutput 
     fo.close(); 
     }catch(Exception e){e.printStackTrace();} 
    } 
+0

यह कोड वास्तव में प्रश्न के लिए प्रासंगिक नहीं है और संकलित भी नहीं करता है। मुझे लगता है कि भविष्य में उपयोग के लिए बिटमैप को जारी रखने के लिए एल्गोरिदम को रेखांकित करने में मूल्य है। – IcedDante