当我使用DownloadManager下载时,进程android.process.media已经死亡

时间:2014-01-07 11:53:47

标签: android gridview android-fragments android-download-manager

我在android中使用DownloadManager启动多个文件下载。

我从Gridview中选择了该项目,然后使用FOR loopFragment-Gridview中发送下载文件请求。

它将创建一个新的Fragment-Download,然后开始下载。

下载完成/失败后或button取消。

关闭Fragment-Download并返回Fragment-Gridview

然后我从GridView中选择项目并再次发送请求。

它有如下日志的错误:

I/ActivityManager(  568): Process android.process.media (pid 10027) has died.
W/ActivityManager(  568): Service crashed 2 times, stopping: ServiceRecord{43db4e90 com.android.providers.media/.MtpService}
W/ActivityManager(  568): Service crashed 2 times, stopping: ServiceRecord{44ae10b0 com.android.providers.downloads/.DownloadService}
W/InputMethodManagerService(  568): Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@4232f8c0 attribute=android.view.inputmethod.EditorInfo@426ea268
I/ActivityManager(  568): Start proc android.process.media for content provider com.android.providers.downloads/.DownloadProvider: pid=10344 uid=10018 gids={1015, 1023, 1024, 1028, 2001, 3003, 3007}
E/Trace   (10344): error opening trace file: No such file or directory (2)
D/ActivityThread(10344): setTargetHeapUtilization:0.25
D/ActivityThread(10344): setTargetHeapIdealFree:8388608
D/ActivityThread(10344): setTargetHeapConcurrentStart:2097152
I/ActivityThread(10344): Pub downloads: com.android.providers.downloads.DownloadProvider

然后我无法取消下载并在此错误后删除。

我应该关闭downloadManager还是刷新/释放资源以避免此问题?

我该怎么办?

----------------------------------------------- ----- EDIT -----------------------------------------

以下代码适用于download fragment

DownloadFileListTask将读取该文件并将该项目添加到GridView newInstance将项目提供给DownloadFileListTask

主要下载代码位于final Runnable startMultipleDownload = new Runnable()

读取文件完成后,将调用startMultipleDownload开始下载。

startMultipleDownload会调用mHandler.postDelayed(Download_Update, 200);来更新下载百分比。

Download_Update中,它会在更新下载百分比后调用mHandler.post(Check_Download_State);

package tw.com.a_i_t.IPCamViewer.FileBrowser;

import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;

import tw.com.a_i_t.IPCamViewer.MainActivity;
import tw.com.a_i_t.IPCamViewer.R;
import tw.com.a_i_t.IPCamViewer.FileBrowser.FileBrowserFragment.FileListAdapter;
import tw.com.a_i_t.IPCamViewer.FileBrowser.Model.FileNode;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.DownloadManager;
import android.app.DownloadManager.Request;
import android.app.Fragment;
import android.content.Context;
import android.content.DialogInterface;
import android.view.View.OnKeyListener;
import android.database.Cursor;
import android.net.DhcpInfo;
import android.net.Uri;
import android.net.wifi.WifiManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.FragmentTransaction;
import android.util.Log;
import android.util.SparseBooleanArray;
import android.view.ActionMode;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.MimeTypeMap;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.GridView;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.AbsListView.MultiChoiceModeListener;

public class DownloadPage extends Fragment implements MultiChoiceModeListener{



    private ProgressBar loading;
    public static ProgressBar download_progress;
    private Map<Integer, Boolean> mSelectMap = new HashMap<Integer, Boolean>();
    public static final String DEFAULT_PATH = "/cgi-bin/Config.cgi" ;
    public static final String DEFAULT_DIR = "DCIM" ;
    private static int index;
    private static final String TAG = "MJPEG Player" ;
    private static Handler mHandler;
    private static Cursor cursor;
    private static FileNode SingleFile;
    private static int[] temp_position = new int[1000];
    private static long[] cancal_download_position = new long[1000];
    private TextView mActionText;
    public static TextView download_percent;
    private GridView fileListView;
    private ImageButton cancel_download;
    private ImageButton cancel_download_all;
    private static final int MENU_SELECT_ALL = 0;
    private static final int MENU_UNSELECT_ALL = MENU_SELECT_ALL + 1;
    public static long downloadID = 0;
    private static SparseBooleanArray item;
    private List<FileNode> fileList;
    //final DownloadPage downloadfragment = new DownloadPage();


    private class DownloadFileListTask extends AsyncTask<FileBrowser, Integer, FileBrowser> {

        @Override
        protected void onPreExecute() {

            setWaitingState(true) ;

            mFileList.clear() ;
            mFileListTitle.setText(mFileBrowser + " : " + mReading + " " + mDirectory) ;
            super.onPreExecute() ;
        }

        @Override
        protected FileBrowser doInBackground(FileBrowser... browsers) {

            browsers[0].retrieveFileList(mDirectory, FileNode.Format.all, true) ;

            return browsers[0] ;
        }

        @Override
        protected void onProgressUpdate(Integer... values) {
            // TODO Auto-generated method stub
            super.onProgressUpdate(values);

        }

        @Override
        protected void onPostExecute(FileBrowser result) {

            Activity activity = getActivity() ;

            if (activity != null) {

                 fileList = result.getFileList() ;

                if(item != null){
                    for(int i = 0 ; i<item.size() ; i++){
                        FileNode list = fileList.get(temp_position[i]);
                        mFileList.add(i, list);
                        Log.i(TAG, "DownloadFile--mFileList.get(i) = " + mFileList.get(i));
                    }

                }

            }
        }
    }


    private String mIp ;
    private String mPath ;
    private String mDirectory ;

    private static final String KEY_IP = "ip" ;
    private static final String KEY_PATH = "path" ;
    private static final String KEY_DIRECTORY = "directory" ;

    private static ArrayList<FileNode> mFileList = new ArrayList<FileNode>() ;


    private TextView mFileListTitle ;
    private String mFileBrowser ;
    private String mReading ;
    private String mItems ;

    public static DownloadPage newInstance(String ip, String url, String directory, SparseBooleanArray checkedItems) {

        DownloadPage fragment = new DownloadPage() ;

        Bundle args = new Bundle() ;

        if (ip != null)
            args.putString(KEY_IP, ip) ;

        if (url != null)
            args.putString(KEY_PATH, url) ;

        if (directory != null)
            args.putString(KEY_DIRECTORY, directory) ;
        item = null;
        item = checkedItems;
        Log.i(TAG, "MultipleItem--newInstance---item = " + item);
        Log.i(TAG, "MultipleItem--newInstance---checkedItems = " + checkedItems.size());
        if (checkedItems != null) {
            for (int i=0; i<checkedItems.size(); i++) {
                if (checkedItems.valueAt(i)) {
                    temp_position[i] = checkedItems.keyAt(i);

                }
            }
        }

        fragment.setArguments(args) ;

        return fragment ;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);

        mIp = getArguments().getString(KEY_IP) ;

        if (mIp == null) {
            WifiManager wifiManager = (WifiManager) getActivity().getSystemService(Context.WIFI_SERVICE) ;

            DhcpInfo dhcpInfo = wifiManager.getDhcpInfo() ;

            if (dhcpInfo != null && dhcpInfo.gateway != 0) {

                mIp = MainActivity.intToIp(dhcpInfo.gateway) ;
            }
        }

        mPath = getArguments().getString(KEY_PATH) ;

        if (mPath == null) {

            mPath = DEFAULT_PATH ;
        }

        mDirectory = getArguments().getString(KEY_DIRECTORY) ;

        if (mDirectory == null) {

            mDirectory = DEFAULT_DIR ;
        }   


    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // TODO Auto-generated method stub

        final View view = inflater.inflate(R.layout.download_page, container, false);   

        mHandler = new Handler();
        loading = (ProgressBar) view.findViewById(R.id.loading);

        mFileBrowser = getActivity().getResources().getString(R.string.label_file_browser) ;
        mReading = getActivity().getResources().getString(R.string.label_reading) ;
        mItems = getActivity().getResources().getString(R.string.label_items) ;

        mFileListTitle = (TextView) view.findViewById(R.id.browserTitle) ;
        mFileListTitle.setText(mFileBrowser + " : " + mDirectory) ;

        //Ampak++++++++++++++++++++++++++++++++++++++++++++++++++++++
        fileListView = (GridView) view.findViewById(R.id.browserList) ;
        fileListView.setChoiceMode(GridView.CHOICE_MODE_MULTIPLE_MODAL);
        fileListView.setMultiChoiceModeListener((MultiChoiceModeListener) this);    
        fileListView.setNumColumns(3);
        download_progress = (ProgressBar) view.findViewById(R.id.download_progress);
        download_percent = (TextView) view.findViewById(R.id.Download_Percent);

        return view;
}


    private boolean mWaitingState = false ;
    private boolean mWaitingVisible = false ;


    //download the multiple file
    final Runnable startMultipleDownload = new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            if (item != null) {

                for (int i=0; i<item.size(); i++) {
                    if (item.valueAt(i)) {
                        Log.i(TAG, "startMultipleDownload--item.size() = " + item.size());
                        Log.i(TAG, "startMultipleDownload--item.valueAt(i) = " + item.size());

                        FileNode file = mFileList.get(i) ;

                        final String filename = file.mName.substring(file.mName.lastIndexOf("/") + 1) ;
                        final String urlString = "http://" + mIp + file.mName ;

                        String serviceString = Context.DOWNLOAD_SERVICE ;
                        DownloadManager downloadManager = (DownloadManager) getActivity().getSystemService(
                                serviceString) ;

                        Uri uri = Uri.parse(urlString) ;
                        DownloadManager.Request request = new Request(uri) ;
                        request.setTitle(filename) ;
                        request.setDescription(urlString) ;

                        String ext = filename.substring(filename.lastIndexOf(".") + 1)
                                .toLowerCase(Locale.US) ;
                        String mimeType = MimeTypeMap.getSingleton()
                        .getMimeTypeFromExtension(ext) ;

                        Log.i("MIME", ext + "  ==>  " + mimeType) ;

                        if (mimeType != null) {
                            request.setMimeType(mimeType) ;
                        }
                        request.allowScanningByMediaScanner() ;

                        request.setNotificationVisibility(Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED) ;

                        request.setDestinationInExternalPublicDir(MainActivity.sAppName, filename) ;

                        cancal_download_position[i] = downloadManager.enqueue(request);
                        downloadID = cancal_download_position[i];
                        Log.i(TAG, "startMultipleDownload--downloadID = " + downloadID);
                        mHandler.postDelayed(Download_Update, 200);

                        }
                    }
                }
        }
    };

    final Runnable Download_Update = new Runnable() {
        //update the download percent
        @Override
        public void run() {
            // TODO Auto-generated method stub

            DownloadManager.Query q = new DownloadManager.Query();
            q.setFilterById(downloadID);

            String serviceString = Context.DOWNLOAD_SERVICE ;
            DownloadManager downloadManager = (DownloadManager) getActivity().getSystemService(
                    serviceString) ;
            cursor = downloadManager.query(q);


            try {

                if(cursor.moveToFirst()){
                    int byte_download = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));
                    int byte_total = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));
                    int download_percent_text = (byte_download*100)/byte_total;

                    download_percent.setText(download_percent_text + "%");
                    download_progress.setProgress(download_percent_text);

                    index = cursor.getColumnIndex(DownloadManager.COLUMN_STATUS);
                    mHandler.post(Check_Download_State);
                    //call "Check_Download_State"(check the is download finish or failed ) after update the download percent 

                }
                cursor.close();

            } catch (Exception e) {
                // TODO: handle exception
            }

            mHandler.postDelayed(this, 200);
        }
    };

final Runnable Check_Download_State = new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub

                    index = cursor.getColumnIndex(DownloadManager.COLUMN_STATUS);

                    //If file download finish or failed , stop handler "Download_Update"(update the download percent)

                    if(DownloadManager.STATUS_SUCCESSFUL == cursor.getInt(index)){
                        Log.i(TAG, "Check_Download_State-- SUCCESSFUL--cursor.getInt(index)" + cursor.getInt(index));
                        mHandler.removeCallbacks(Download_Update);
                    }else if(DownloadManager.STATUS_FAILED == cursor.getInt(index)){
                        Log.i(TAG, "Check_Download_State-- FAILED--cursor.getInt(index)" + cursor.getInt(index));
                        mHandler.removeCallbacks(Download_Update);
                    }
                }       
    };

    private void setWaitingState(boolean waiting) {

        if (mWaitingState != waiting) {

            mWaitingState = waiting ;

            Log.i(TAG, "setWaitingState-----waiting = " + waiting);
            //Log.i(TAG, "setWaitingState-----item.size() = " + item.size());
            if(mWaitingState == false){
                if(item.size() >= 0){
                    mHandler.post(startMultipleDownload);
                }
            }
            setWaitingIndicator(mWaitingState, mWaitingVisible) ;
        }
    }

    private void setWaitingIndicator(boolean waiting, boolean visible) {

        if (!visible)
            return ;

        Activity activity = getActivity() ;

        if (activity != null) {
            activity.setProgressBarIndeterminate(true) ;
            activity.setProgressBarIndeterminateVisibility(waiting) ;

            Log.i(TAG, "waiting = " + waiting);

            if(waiting == true){
                loading.setVisibility(View.VISIBLE);
            }else if(waiting == false){
                loading.setVisibility(View.GONE);
            }
        }
    }

    private void clearWaitingIndicator() {

        mWaitingVisible = false ;
        Log.i(TAG, "clearWaitingIndicator---waiting = " + false);
        setWaitingIndicator(false, true) ;
    }

    private void restoreWaitingIndicator() {

        mWaitingVisible = true ;
        Log.i(TAG, "restoreWaitingIndicator---waiting = " + mWaitingState);
        setWaitingIndicator(mWaitingState, true) ;
    }

    private void closefragment() {
        getActivity().getFragmentManager().popBackStack();
    }


    @Override
    public void onResume() {

        mFileList.clear() ;
        restoreWaitingIndicator() ;

        try {
            new DownloadFileListTask().execute(new FileBrowser(new URL("http://" + mIp + mPath),
                    FileBrowser.COUNT_MAX)) ;
        } catch (MalformedURLException e) {
            e.printStackTrace() ;
        }

        super.onResume() ;

        Log.i(TAG, "Download----onResume");
    }

    @Override
    public void onPause() {
        clearWaitingIndicator() ;
        Log.i(TAG, "Download----onPause");
        super.onPause() ;
    }

    @Override
    public void onDestroy() {
        // TODO Auto-generated method stub
        item = null;
        downloadID = 0;

        mHandler.removeCallbacks(startMultipleDownload);
        mHandler.removeCallbacks(Download_Update);
        Log.i(TAG, "Download----onDestroy");
        super.onDestroy();
    }

    private String formatString(int count) {
        return String.format(getString(R.string.selection), count);
    }   
}

0 个答案:

没有答案