1702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project/* //device/content/providers/media/src/com/android/providers/media/MediaScannerReceiver.java 2702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project** 3702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project** Copyright 2007, The Android Open Source Project 4702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project** 5702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License"); 6702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project** you may not use this file except in compliance with the License. 7702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project** You may obtain a copy of the License at 8702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project** 9702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project** http://www.apache.org/licenses/LICENSE-2.0 10702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project** 11702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project** Unless required by applicable law or agreed to in writing, software 12702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project** distributed under the License is distributed on an "AS IS" BASIS, 13702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project** See the License for the specific language governing permissions and 15702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project** limitations under the License. 16702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project*/ 17702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project 18702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Projectpackage com.android.providers.media; 19702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project 208efd65fe64c7978534bb549b2329068a2f8c5075Jeff Sharkeyimport android.content.BroadcastReceiver; 21702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Projectimport android.content.Context; 22702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Projectimport android.content.Intent; 23702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Projectimport android.net.Uri; 24702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Projectimport android.os.Bundle; 254fc4097f6d46c64e946426c1e905858b5a7e9c32Mike Lockwoodimport android.os.Environment; 264fc4097f6d46c64e946426c1e905858b5a7e9c32Mike Lockwoodimport android.util.Log; 27702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project 28e358a9013e9a33b5dc0ab5b25e7748d92d01c066Marco Nelissenimport java.io.File; 29e358a9013e9a33b5dc0ab5b25e7748d92d01c066Marco Nelissenimport java.io.IOException; 30e358a9013e9a33b5dc0ab5b25e7748d92d01c066Marco Nelissen 318efd65fe64c7978534bb549b2329068a2f8c5075Jeff Sharkeypublic class MediaScannerReceiver extends BroadcastReceiver { 32702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project private final static String TAG = "MediaScannerReceiver"; 33702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project 34702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project @Override 35702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project public void onReceive(Context context, Intent intent) { 368efd65fe64c7978534bb549b2329068a2f8c5075Jeff Sharkey final String action = intent.getAction(); 378efd65fe64c7978534bb549b2329068a2f8c5075Jeff Sharkey final Uri uri = intent.getData(); 388efd65fe64c7978534bb549b2329068a2f8c5075Jeff Sharkey if (Intent.ACTION_BOOT_COMPLETED.equals(action)) { 3981befcaad462ea93d3683339232898b96185999eJeff Sharkey // Scan both internal and external storage 40702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project scan(context, MediaProvider.INTERNAL_VOLUME); 4181befcaad462ea93d3683339232898b96185999eJeff Sharkey scan(context, MediaProvider.EXTERNAL_VOLUME); 428efd65fe64c7978534bb549b2329068a2f8c5075Jeff Sharkey 43702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project } else { 44702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project if (uri.getScheme().equals("file")) { 45702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project // handle intents related to external storage 46702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project String path = uri.getPath(); 47235df0dced216be183af77a4083ee0968a472fc0Mike Lockwood String externalStoragePath = Environment.getExternalStorageDirectory().getPath(); 48e358a9013e9a33b5dc0ab5b25e7748d92d01c066Marco Nelissen String legacyPath = Environment.getLegacyExternalStorageDirectory().getPath(); 49e358a9013e9a33b5dc0ab5b25e7748d92d01c066Marco Nelissen 50e358a9013e9a33b5dc0ab5b25e7748d92d01c066Marco Nelissen try { 51e358a9013e9a33b5dc0ab5b25e7748d92d01c066Marco Nelissen path = new File(path).getCanonicalPath(); 52e358a9013e9a33b5dc0ab5b25e7748d92d01c066Marco Nelissen } catch (IOException e) { 53e358a9013e9a33b5dc0ab5b25e7748d92d01c066Marco Nelissen Log.e(TAG, "couldn't canonicalize " + path); 54e358a9013e9a33b5dc0ab5b25e7748d92d01c066Marco Nelissen return; 55e358a9013e9a33b5dc0ab5b25e7748d92d01c066Marco Nelissen } 56e358a9013e9a33b5dc0ab5b25e7748d92d01c066Marco Nelissen if (path.startsWith(legacyPath)) { 57e358a9013e9a33b5dc0ab5b25e7748d92d01c066Marco Nelissen path = externalStoragePath + path.substring(legacyPath.length()); 58e358a9013e9a33b5dc0ab5b25e7748d92d01c066Marco Nelissen } 59235df0dced216be183af77a4083ee0968a472fc0Mike Lockwood 60235df0dced216be183af77a4083ee0968a472fc0Mike Lockwood Log.d(TAG, "action: " + action + " path: " + path); 618efd65fe64c7978534bb549b2329068a2f8c5075Jeff Sharkey if (Intent.ACTION_MEDIA_MOUNTED.equals(action)) { 62235df0dced216be183af77a4083ee0968a472fc0Mike Lockwood // scan whenever any volume is mounted 63235df0dced216be183af77a4083ee0968a472fc0Mike Lockwood scan(context, MediaProvider.EXTERNAL_VOLUME); 648efd65fe64c7978534bb549b2329068a2f8c5075Jeff Sharkey } else if (Intent.ACTION_MEDIA_SCANNER_SCAN_FILE.equals(action) && 6517ad80b32f839ccddac3911799ff732d1ca3a006Mike Lockwood path != null && path.startsWith(externalStoragePath + "/")) { 6617ad80b32f839ccddac3911799ff732d1ca3a006Mike Lockwood scanFile(context, path); 67702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project } 68702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project } 69702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project } 70702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project } 71702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project 72702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project private void scan(Context context, String volume) { 73702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project Bundle args = new Bundle(); 74702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project args.putString("volume", volume); 75702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project context.startService( 76702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project new Intent(context, MediaScannerService.class).putExtras(args)); 77702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project } 78702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project 79702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project private void scanFile(Context context, String path) { 80702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project Bundle args = new Bundle(); 81702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project args.putString("filepath", path); 82702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project context.startService( 83702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project new Intent(context, MediaScannerService.class).putExtras(args)); 84702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project } 85702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project} 86