15

मैं प्रोग्राम को डाउनलोड करने के लिए DownloadManager कक्षा का उपयोग कर रहा हूं। सभी ठीक काम करते हैं लेकिन मैं डाउनलोड को पूरा करने के लिए पूर्ण नोटिफिकेशन नहीं प्राप्त कर सकता। एक बार डाउनलोड पूरा होने के तुरंत बाद गायब हो जाता है। यहाँ मेरी कोड है:जिंजरब्रेड उपकरणों पर "डाउनलोड पूर्ण" अधिसूचना गायब क्यों होती है?

Request rqtRequest = new Request(Uri.parse(((URI) vewView.getTag()).toString())); 
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) { 
    rqtRequest.setShowRunningNotification(true); 
} else { 
    rqtRequest.setNotificationVisibility(Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); 
} 
((DownloadManager) getSystemService(DOWNLOAD_SERVICE)).enqueue(rqtRequest); 

मैं इस से संबंधित वेब के आसपास कुछ सवाल को देखा है, लेकिन मैं एक समाधान नहीं मिल सका।

उत्तर

16

DownloadManager जिंजरब्रेड पर पूर्णता अधिसूचना का समर्थन नहीं करता है; आपको इसे स्वयं प्रदर्शित करना होगा।

एक BroadcastReceiver to detect when the download finishes का उपयोग करें और अपनी स्वयं की सूचना दिखाने:

public class DownloadBroadcastReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     String action = intent.getAction(); 

     if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) { 
      //Show a notification 
     } 
    } 
} 

और अपने मेनिफ़ेस्ट में इसे पंजीकृत:

<receiver android:name="com.zolmo.twentymm.receivers.DownloadBroadcastReceiver"> 
    <intent-filter> 
     <action android:name="android.intent.action.DOWNLOAD_COMPLETE"/> 
    </intent-filter> 
</receiver> 

इसके अलावा, setNotificationVisibility एपीआई स्तर 11 (Honeycomb) नहीं आईसीएस में जोड़ा गया है। मुझे यकीन है कि नहीं कर रहा हूँ अगर आईसीएस निरंतर के आपके उपयोग जानबूझकर है या नहीं, लेकिन आप के रूप में अच्छी हनीकोम्ब पर सिस्टम सूचना उपयोग करने के लिए निम्न करने के लिए अपने कोड बदल सकते हैं:

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) { 
    rqtRequest.setShowRunningNotification(true); 
} else { 
    rqtRequest.setNotificationVisibility(Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); 
} 
0

ठीक है, आप किस संस्करण पर परीक्षण कर रहे हैं? VISIBILITY_VISIBLE_NOTIFY_COMPLETED को सेट करने से अधिसूचना सेट करनी चाहिए ताकि डाउनलोड पूर्ण होने पर ही प्रदर्शित हो। अगर अधिसूचना डाउनलोड के दौरान दिखाई दे रही है, तो मुझे यह मानना ​​होगा कि आप आईसीएस के पिछले प्लेटफ़ॉर्म पर चल रहे हैं। मैं ऐप डीबग कर दूंगा। यह देखने के लिए ब्रेकपॉइंट्स सेट करें कि आपके कौन से "if" विकल्प निष्पादित किए जा रहे हैं।

+0

आईसीएस और नए उपकरणों पर, अधिसूचना ठीक दिखाई देती है - दोनों डाउनलोड के दौरान और डाउनलोड के बाद बनी रहती है। जिंजरब्रेड और पुराने उपकरणों पर, यह डाउनलोड करते समय दिखाता है लेकिन पूरा होने पर गायब हो जाता है। इस बारे में डेवलपर दस्तावेज कुछ भी नहीं है। मुझे ब्रेकपॉइंट्स डालने की ज़रूरत नहीं थी क्योंकि मैंने 'if' कथन को हटाने और इसे एक गिंगब्रेड एमुलेटर पर चलाने का प्रयास किया है। कोड निष्पादित हो जाता है और डाउनलोड करते समय अधिसूचना दिखाई देती है लेकिन यह है। –

0

शायद यह एक मोटा (लेकिन सरल) तरीका है: डाउनलोड समाप्त होने के बाद आप केवल नई अधिसूचना बनाना पसंद कर सकते हैं पीएस: आह, और मुझे खेद है, यह वास्तव में "क्यों" सवाल का जवाब नहीं है, लेकिन यह अभी भी आपके लिए उपयोगी हो सकता है

2

आप अपनी खुद की बनाने के लिए जिंजरब्रेड के लिए पूर्ण अधिसूचना डाउनलोड करें।

पहले, DownloadManager से डाउनलोड के लिए एक संदर्भ मिलता है: अपने स्वयं के डाउनलोड पूरा अधिसूचना बंद भेज

IntentFilter filter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE); 

BroadcastReceiver receiver = new BroadcastReceiver() { 
    @Override public void onReceive(Context context, Intent intent) { 
     long reference = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1); 
     if (downloadReference == reference) { 
       // Send your own notification 
     } 
    } 
}; 

registerReceiver(receiver, filter); 

और:

DownloadManager downloadManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE); 
DownloadManager.Request request = new Request(someUri); 
//... 
long downloadReference = downloadManager.enqueue(request); 

फिर अपने कस्टम BroacastReceiver में dowload पूरा प्रसारण के लिए सुनने ।

+0

इस दृष्टिकोण के साथ चेतावनी यह है कि ब्रॉडकास्ट रिसीवर गतिविधि जीवन चक्र से बंधेगा। अधिसूचना बढ़ाने के लिए [मेनिफेस्ट पंजीकृत रिसीवर] (http://stackoverflow.com/a/13824306/80425) का उपयोग करना बेहतर है। –

+0

@ डेविड कैंट। अच्छा जवाब, आपके उत्तर में शामिल है। मैंने इसे +1 किया है। –

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