MediaScannerConnection.java revision b7c8c76180dc1abbf55c734ab121a7a2469060f6
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.media;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ComponentName;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ServiceConnection;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.media.IMediaScannerListener;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.media.IMediaScannerService;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Config;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
33b7c8c76180dc1abbf55c734ab121a7a2469060f6Ray Chen * MediaScannerConnection provides a way for applications to pass a
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * newly created or downloaded media file to the media scanner service.
35b7c8c76180dc1abbf55c734ab121a7a2469060f6Ray Chen * The media scanner service will read metadata from the file and add
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the file to the media content provider.
37b7c8c76180dc1abbf55c734ab121a7a2469060f6Ray Chen * The MediaScannerConnectionClient provides an interface for the
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * media scanner service to return the Uri for a newly scanned file
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to the client of the MediaScannerConnection class.
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class MediaScannerConnection implements ServiceConnection {
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String TAG = "MediaScannerConnection";
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Context mContext;
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private MediaScannerConnectionClient mClient;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private IMediaScannerService mService;
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mConnected; // true if connect() has been called since last disconnect()
49b7c8c76180dc1abbf55c734ab121a7a2469060f6Ray Chen
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private IMediaScannerListener.Stub mListener = new IMediaScannerListener.Stub() {
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void scanCompleted(String path, Uri uri) {
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            MediaScannerConnectionClient client = mClient;
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (client != null) {
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                client.onScanCompleted(path, uri);
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
60e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn     * Interface for notifying clients of the result of scanning a
61e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn     * requested media file.
62e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn     */
63b7c8c76180dc1abbf55c734ab121a7a2469060f6Ray Chen    public interface OnScanCompletedListener {
64e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn        /**
65e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn         * Called to notify the client when the media scanner has finished
66e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn         * scanning a file.
67e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn         * @param path the path to the file that has been scanned.
68b7c8c76180dc1abbf55c734ab121a7a2469060f6Ray Chen         * @param uri the Uri for the file if the scanning operation succeeded
69b7c8c76180dc1abbf55c734ab121a7a2469060f6Ray Chen         * and the file was added to the media database, or null if scanning failed.
70b7c8c76180dc1abbf55c734ab121a7a2469060f6Ray Chen         */
71e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn        public void onScanCompleted(String path, Uri uri);
72e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    }
73b7c8c76180dc1abbf55c734ab121a7a2469060f6Ray Chen
74e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    /**
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * An interface for notifying clients of MediaScannerConnection
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * when a connection to the MediaScanner service has been established
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and when the scanning of a file has completed.
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
79b7c8c76180dc1abbf55c734ab121a7a2469060f6Ray Chen    public interface MediaScannerConnectionClient extends OnScanCompletedListener {
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
81b7c8c76180dc1abbf55c734ab121a7a2469060f6Ray Chen         * Called to notify the client when a connection to the
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * MediaScanner service has been established.
83b7c8c76180dc1abbf55c734ab121a7a2469060f6Ray Chen         */
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void onMediaScannerConnected();
85b7c8c76180dc1abbf55c734ab121a7a2469060f6Ray Chen
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Called to notify the client when the media scanner has finished
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * scanning a file.
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param path the path to the file that has been scanned.
90b7c8c76180dc1abbf55c734ab121a7a2469060f6Ray Chen         * @param uri the Uri for the file if the scanning operation succeeded
91b7c8c76180dc1abbf55c734ab121a7a2469060f6Ray Chen         * and the file was added to the media database, or null if scanning failed.
92b7c8c76180dc1abbf55c734ab121a7a2469060f6Ray Chen         */
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void onScanCompleted(String path, Uri uri);
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Constructs a new MediaScannerConnection object.
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param context the Context object, required for establishing a connection to
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the media scanner service.
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param client an optional object implementing the MediaScannerConnectionClient
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * interface, for receiving notifications from the media scanner.
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public MediaScannerConnection(Context context, MediaScannerConnectionClient client) {
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext = context;
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mClient = client;
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Initiates a connection to the media scanner service.
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link MediaScannerConnectionClient#onMediaScannerConnected()}
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will be called when the connection is established.
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void connect() {
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (this) {
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mConnected) {
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Intent intent = new Intent(IMediaScannerService.class.getName());
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mContext.bindService(intent, this, Context.BIND_AUTO_CREATE);
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mConnected = true;
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Releases the connection to the media scanner service.
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void disconnect() {
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (this) {
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mConnected) {
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (Config.LOGV) {
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.v(TAG, "Disconnecting from Media Scanner");
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mContext.unbindService(this);
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (IllegalArgumentException ex) {
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (Config.LOGV) {
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Log.v(TAG, "disconnect failed: " + ex);
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mConnected = false;
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
143b7c8c76180dc1abbf55c734ab121a7a2469060f6Ray Chen
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns whether we are connected to the media scanner service
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if we are connected, false otherwise
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public synchronized boolean isConnected() {
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (mService != null && mConnected);
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Requests the media scanner to scan a file.
154b7c8c76180dc1abbf55c734ab121a7a2469060f6Ray Chen     * Success or failure of the scanning operation cannot be determined until
155e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn     * {@link MediaScannerConnectionClient#onScanCompleted(String, Uri)} is called.
156b7c8c76180dc1abbf55c734ab121a7a2469060f6Ray Chen     *
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param path the path to the file to be scanned.
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param mimeType  an optional mimeType for the file.
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If mimeType is null, then the mimeType will be inferred from the file extension.
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     public void scanFile(String path, String mimeType) {
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (this) {
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mService == null || !mConnected) {
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new IllegalStateException("not connected to MediaScannerService");
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (Config.LOGV) {
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.v(TAG, "Scanning file " + path);
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mService.requestScanFile(path, mimeType, mListener);
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (Config.LOGD) {
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.d(TAG, "Failed to scan file " + path);
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
178b7c8c76180dc1abbf55c734ab121a7a2469060f6Ray Chen
179e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    static class ClientProxy implements MediaScannerConnectionClient {
180e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn        final String[] mPaths;
181e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn        final String[] mMimeTypes;
182b7c8c76180dc1abbf55c734ab121a7a2469060f6Ray Chen        final OnScanCompletedListener mClient;
183e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn        MediaScannerConnection mConnection;
184e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn        int mNextPath;
185b7c8c76180dc1abbf55c734ab121a7a2469060f6Ray Chen
186b7c8c76180dc1abbf55c734ab121a7a2469060f6Ray Chen        ClientProxy(String[] paths, String[] mimeTypes, OnScanCompletedListener client) {
187e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            mPaths = paths;
188e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            mMimeTypes = mimeTypes;
189e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            mClient = client;
190e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn        }
191b7c8c76180dc1abbf55c734ab121a7a2469060f6Ray Chen
192e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn        public void onMediaScannerConnected() {
193e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            scanNextPath();
194e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn        }
195b7c8c76180dc1abbf55c734ab121a7a2469060f6Ray Chen
196e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn        public void onScanCompleted(String path, Uri uri) {
197e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            if (mClient != null) {
198e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                mClient.onScanCompleted(path, uri);
199e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            }
200e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            scanNextPath();
201e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn        }
202b7c8c76180dc1abbf55c734ab121a7a2469060f6Ray Chen
203e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn        void scanNextPath() {
204e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            if (mNextPath >= mPaths.length) {
205e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                mConnection.disconnect();
206e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                return;
207e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            }
208e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            String mimeType = mMimeTypes != null ? mMimeTypes[mNextPath] : null;
209e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            mConnection.scanFile(mPaths[mNextPath], mimeType);
210e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            mNextPath++;
211e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn        }
212e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    }
213b7c8c76180dc1abbf55c734ab121a7a2469060f6Ray Chen
214e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    /**
215e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn     * Convenience for constructing a {@link MediaScannerConnection}, calling
216e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn     * {@link #connect} on it, and calling {@link #scanFile} with the given
217e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn     * <var>path</var> and <var>mimeType</var> when the connection is
218e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn     * established.
219e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn     * @param context The caller's Context, required for establishing a connection to
220e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn     * the media scanner service.
221b7c8c76180dc1abbf55c734ab121a7a2469060f6Ray Chen     * Success or failure of the scanning operation cannot be determined until
222e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn     * {@link MediaScannerConnectionClient#onScanCompleted(String, Uri)} is called.
223e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn     * @param paths Array of paths to be scanned.
224e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn     * @param mimeTypes Optional array of MIME types for each path.
225e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn     * If mimeType is null, then the mimeType will be inferred from the file extension.
226e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn     * @param callback Optional callback through which you can receive the
227e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn     * scanned URI and MIME type; If null, the file will be scanned but
228e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn     * you will not get a result back.
229e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn     * @see scanFile(String, String)
230e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn     */
231e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    public static void scanFile(Context context, String[] paths, String[] mimeTypes,
232b7c8c76180dc1abbf55c734ab121a7a2469060f6Ray Chen            OnScanCompletedListener callback) {
233e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn        ClientProxy client = new ClientProxy(paths, mimeTypes, callback);
234e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn        MediaScannerConnection connection = new MediaScannerConnection(context, client);
235e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn        client.mConnection = connection;
236e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn        connection.connect();
237e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    }
238b7c8c76180dc1abbf55c734ab121a7a2469060f6Ray Chen
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Part of the ServiceConnection interface.  Do not call.
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onServiceConnected(ComponentName className, IBinder service) {
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (Config.LOGV) {
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.v(TAG, "Connected to Media Scanner");
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (this) {
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mService = IMediaScannerService.Stub.asInterface(service);
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mService != null && mClient != null) {
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mClient.onMediaScannerConnected();
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Part of the ServiceConnection interface.  Do not call.
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onServiceDisconnected(ComponentName className) {
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (Config.LOGV) {
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.v(TAG, "Disconnected from Media Scanner");
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (this) {
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mService = null;
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
266