5

मेरे एप्लिकेशन प्रक्रियाएं छवियों, मैं पहले से ही Android डिवाइस में छवियों संग्रहीत प्रक्रिया कर सकते हैं। मैं भी नई छवियों को संसाधित करना चाहता हूं। क्या कोई श्रोता है जो गैलरी में जब भी नई तस्वीरें आती है तो मुझे सूचित करेगी? मैं दो दिनों की तलाश कर रहा हूं। मैं कुछ ठोस नहीं मिला।एंड्रॉइड में नई तस्वीरें कैसे सुनें?

मैंने पढ़ा है के बारे में FileObserver, यह मेरे में मदद मिलेगी दोनों उन चित्र डाउनलोड करने सुनने या कैमरे का उपयोग कर नई तस्वीरें लेने के लिए?

उत्तर

7

नई तस्वीरें गैलरी

मतलब है कि यह MediaStore में जोड़ा गया है करने के लिए आता है।

सबसे पहले, FileOberver एक स्मृति-हत्यारा दृष्टिकोण है। फ़ाइलों की एक बड़ी मात्रा पर विचार करें। इसके बजाय ContentObserver एक बेहतर बेहतर दृष्टिकोण लगता है।

getContentResolver().registerContentObserver(android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI, true, 
     new ContentObserver(new Handler()) { 
      @Override 
      public void onChange(boolean selfChange) { 
       Log.d("your_tag","Internal Media has been changed"); 
       super.onChange(selfChange); 
       Long timestamp = readLastDateFromMediaStore(context, MediaStore.Images.Media.INTERNAL_CONTENT_URI); 
       // comapare with your stored last value and do what you need to do 

      } 
     } 
    ); 
getContentResolver().registerContentObserver(android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI, true, 
    new ContentObserver(new Handler()) { 
     @Override 
     public void onChange(boolean selfChange) { 
      Log.d("your_tag","External Media has been changed"); 
      super.onChange(selfChange); 

      Long timestamp = readLastDateFromMediaStore(context, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
      // comapare with your stored last value and do what you need to do 
     } 
    } 
); 

private Long readLastDateFromMediaStore(Context context, Uri uri) { 
     Cursor cursor = context.getContentResolver().query(uri, null, null, null, "date_added DESC"); 
     PhotoHolder media = null; 
     Long dateAdded =-1; 
     if (cursor.moveToNext()) { 
      Long dateAdded = cursor.getLong(cursor.getColumnIndexOrThrow(MediaColumns.DATE_ADDED));   
     } 
     cursor.close(); 
     return dateAdded; 
} 

शायद सेवा में कभी भी ऐसा करने का अच्छा विचार है (कभी चल रहा है)! आपको onDestroy()

चेतावनी: यह केवल आपको बताता है कि मीडियास्टोर बदल गया है, यह कुछ भी अतिरिक्त/हटाने के बारे में कुछ नहीं बताता है। इसके लिए, आपको अपने पिछले डेटाबेस या किसी भी बदलाव से किसी भी बदलाव का पता लगाने के लिए मीडियास्टोर से पूछताछ करनी पड़ सकती है।

+0

तो तुम सुझाव है कि हम एक तुलना के रूप में एक डेटाबेस बनाना चाहिए, इसलिए हम इसके अलावा या हटाने के बारे में पता लगा सकता है? क्या यह बहुत ज्यादा नहीं है? नए एंड्रॉयड ContentObserver 'सार्वजनिक शून्य onChange (बूलियन selfChange, उरी uri) है' आपको लगता है कि हम उस अलावा/विलोपन पता लगाने के लिए उपयोग कर सकते हैं करते हैं? – HendraWD

+0

1. हाँ, हमें तब अपने डेटाबेस की आवश्यकता होगी। 2. कोई अपनी इतना overkill नहीं। मुझे समझाएं, आपको उस समय के बारे में जानकारी होनी चाहिए जब आपने पिछली बार जांच की थी। तो जब आप पूछताछ कर रहे हों, तो आपको उस तारीख-समय तक अपना डेटाबेस अपडेट करना होगा। 3. यह ऑनचेंज() उपयोगी हो सकता है, लेकिन हालांकि मैंने इसका उपयोग नहीं किया है, इसलिए यह सुनिश्चित नहीं हो सकता है। दस्तावेज़ीकरण कहता है - ढांचे के पुराने संस्करणों पर सही संचालन सुनिश्चित करने के लिए जो उरी तर्क प्रदान नहीं करता है, अनुप्रयोगों को ऑनचेंज (बूलियन, उरी) अधिभार लागू करने पर इस विधि के ऑन चेंज (बूलियन) अधिभार को भी लागू करना चाहिए। –

संबंधित मुद्दे