2014-10-26 4 views
31

Я хочу получить имя файла из пути файла SDK. , например. : /storage/sdcard0/DCIM/Camera/1414240995236.jpg I want get 1414240995236.jpg Я написал код, чтобы получить то же самое, но он не работает. Пожалуйста помоги.
Ниже мой код:Как получить имя файла из пути к файлу в android

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{ 
    if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) { 

     if (resultCode == RESULT_OK) { 

      /*********** Load Captured Image And Data Start ****************/ 

      String imageId = convertImageUriToFile(imageUri,CameraActivity); 


      // Create and excecute AsyncTask to load capture image 

      new LoadImagesFromSDCard().execute(""+imageId); 

      /*********** Load Captured Image And Data End ****************/ 


     } else if (resultCode == RESULT_CANCELED) { 

      Toast.makeText(this, " Picture was not taken ", Toast.LENGTH_SHORT).show(); 
     } else { 

      Toast.makeText(this, " Picture was not taken ", Toast.LENGTH_SHORT).show(); 
     } 
    } 
} 


/************ Convert Image Uri path to physical path **************/ 

public static String convertImageUriToFile (Uri imageUri, Activity activity) { 

    Cursor cursor = null; 
    int imageID = 0; 

    try { 

     /*********** Which columns values want to get *******/ 
     String [] proj={ 
       MediaStore.Images.Media.DATA, 
       MediaStore.Images.Media._ID, 
       MediaStore.Images.Thumbnails._ID, 
       MediaStore.Images.ImageColumns.ORIENTATION 
     }; 

     cursor = activity.managedQuery(

       imageUri,   // Get data for specific image URI 
       proj,    // Which columns to return 
       null,    // WHERE clause; which rows to return (all rows) 
       null,    // WHERE clause selection arguments (none) 
       null    // Order-by clause (ascending by name) 

       ); 

     // Get Query Data 

     int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID); 
     int columnIndexThumb = cursor.getColumnIndexOrThrow(MediaStore.Images.Thumbnails._ID); 
     int file_ColumnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 

     //int orientation_ColumnIndex = cursor. 
     // getColumnIndexOrThrow(MediaStore.Images.ImageColumns.ORIENTATION); 

     int size = cursor.getCount(); 

     /******* If size is 0, there are no images on the SD Card. *****/ 

     if (size == 0) { 


      imageDetails.setText("No Image"); 
     } 
     else 
     { 

      int thumbID = 0; 
      if (cursor.moveToFirst()) { 

       /**************** Captured image details ************/ 

       /***** Used to show image on view in LoadImagesFromSDCard class ******/ 
       imageID  = cursor.getInt(columnIndex); 

       thumbID  = cursor.getInt(columnIndexThumb); 

       String Path = cursor.getString(file_ColumnIndex); 

       //String orientation = cursor.getString(orientation_ColumnIndex); 

       String CapturedImageDetails = " CapturedImageDetails : \n\n" 
         +" ImageID :"+imageID+"\n" 
         +" ThumbID :"+thumbID+"\n" 
         +" Path :"+Path+"\n"; 
       full_path_name=Path; 



     //this is my path 
     //Path :/storage/sdcard0/DCIM/Camera/1414240995236.jpg i want get 1414240995236.jpg 








       // Show Captured Image detail on activity 
       imageDetails.setText(Path); 

      } 
     } 
    } finally { 
     if (cursor != null) { 
      cursor.close(); 
     } 
    } 

    // Return Captured Image ImageID (By this ImageID Image will load from sdcard) 

    return ""+imageID; 
} 


/** 
* Async task for loading the images from the SD card. 
* 
* @author Android Example 
* 
*/ 

// Class with extends AsyncTask class 

public class LoadImagesFromSDCard extends AsyncTask<String, Void, Void> { 

    private ProgressDialog Dialog = new ProgressDialog(CameraPhotoCapture.this); 

    Bitmap mBitmap; 

    protected void onPreExecute() { 
     /****** NOTE: You can call UI Element here. *****/ 

     // Progress Dialog 
     Dialog.setMessage(" Loading image from Sdcard.."); 
     Dialog.show(); 
    } 


    // Call after onPreExecute method 
    protected Void doInBackground(String... urls) { 

     Bitmap bitmap = null; 
     Bitmap newBitmap = null; 
     Uri uri = null;  


     try { 

      /** Uri.withAppendedPath Method Description 
      * Parameters 
      * baseUri Uri to append path segment to 
      * pathSegment encoded path segment to append 
      * Returns 
      * a new Uri based on baseUri with the given segment appended to the path 
      */ 

      uri = Uri.withAppendedPath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "" + urls[0]); 

      /************** Decode an input stream into a bitmap. *********/ 
      bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri)); 

      if (bitmap != null) { 

       /********* Creates a new bitmap, scaled from an existing bitmap. ***********/ 

       newBitmap = Bitmap.createScaledBitmap(bitmap, 170, 170, true); 

       bitmap.recycle(); 

       if (newBitmap != null) { 

        mBitmap = newBitmap; 
       } 
      } 
     } catch (IOException e) { 
      // Error fetching image, try to recover 

      /********* Cancel execution of this task. **********/ 
      cancel(true); 
     } 

     return null; 
    } 


    protected void onPostExecute(Void unused) { 

     // NOTE: You can call UI Element here. 

     // Close progress dialog 
     Dialog.dismiss(); 

     if(mBitmap != null) 
     { 
      // Set Image to ImageView 

      showImg.setImageBitmap(mBitmap); 
     } 

    } 

} 

ответ

106

я думаю, что вы можете использовать подстроку METHODE, чтобы получить имя файла из строки пути.

String path=":/storage/sdcard0/DCIM/Camera/1414240995236.jpg";//it contain your path of image..im using a temp string.. 
    String filename=path.substring(path.lastIndexOf("/")+1); 
+0

Спасибо другу, что он работает ... –

+0

работает успешно. –

+8

Я думаю, вы должны использовать File.separator вместо «/» –

26

Самым простым решением является использование Uri.getLastPathSegment():

String filename = uri.getLastPathSegment(); 
+0

@manimcaAndroidDeveloper Будьте уверены, чтобы показать свою благодарность с upvote и принимающему мой ответ (когда таймер заканчивается). –

+0

Я уверен. но я не могу получить имя файла. Я получил такой ответ. /storage/sdcard/DCIM/Camera/1414302043784.jpg –

+0

@manimcaAndroidDeveloper Что такое точный код, который дает этот результат? –

0

вы можете использовать Common IO библиотеку, которая может получить вам имя базы вашего файла и расширения.

String fileUrl=":/storage/sdcard0/DCIM/Camera/1414240995236.jpg"; 
     String fileName=FilenameUtils.getBaseName(fileUrl); 
      String fileExtention=FilenameUtils.getExtension(fileUrl); 
//this will return filename:1414240995236 and fileExtention:jpg 
+0

К сожалению, во время выполнения многие люди получают это: «java.lang.NoClassDefFoundError: сбой разрешения: Lorg/apache/Обще/И.О./FilenameUtils;» –

23

Простой и легкий способ получить имя файла

File file = new File("/storage/sdcard0/DCIM/Camera/1414240995236.jpg"); 
String strFileName = file.getName(); 

После добавления этого кода и печати strFileName вы получите strFileName = 1414240995236.jpg

+0

Спасибо Рави! – ORY

+0

Вы приветствуете @ORY –

2

Старая нить, но думал, что обновление;

File theFile = ....... 
String theName = theFile.getName(); // Get the file name 
String thePath = theFile.getAbsolutePath(); // Get the full 

Дополнительную информацию можно найти здесь; Android File Class

+0

Я пропустил пост Р. В. Панчала, повысил его. –

3

FilenameUtils на помощь:

String filename = FilenameUtils.getName("/storage/sdcard0/DCIM/Camera/1414240995236.jpg"); 
0

Мы можем найти имя файла ниже код:

File file =new File(Path); 
String filename=file.getName(); 
Смежные вопросы