【问题标题】:How to get file name from file path in android如何从android中的文件路径获取文件名
【发布时间】:2014-12-21 14:23:56
【问题描述】:

我想从 sdcard 文件路径中获取文件名。 例如:/storage/sdcard0/DCIM/Camera/1414240995236.jpg I want get 1414240995236.jpg 我已经编写了代码来获取相同的内容,但它不起作用。请帮忙。
以下是我的代码:

@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);
        } 

    }

}

【问题讨论】:

    标签: android android-camera android-sdcard


    【解决方案1】:

    我认为您可以使用 substring 方法从路径字符串中获取文件名。

    String path=":/storage/sdcard0/DCIM/Camera/1414240995236.jpg"; 
    // it contains your image path...I'm using a temp string...
    String filename=path.substring(path.lastIndexOf("/")+1);
    

    【讨论】:

    • 我认为你应该使用 File.separator 而不是 "/"
    • 它不起作用,假设我的文件路径是“:/storage/sdcard0/DCIM/Camera/2014/04/03.jpg”然后它会像“03.jpg”一样返回我所以试试这个解决方案 100% 有效stackoverflow.com/a/34435874/3374796
    • @RvPanchal 你有什么问题?它应该返回文件名“03.jpg”
    • @RvPanchal 那么您的解决方案与链接有何不同?您的解决方案也会给出结果“03.jpg”。
    • 如果您的意思是“2014/04/03.jpg”应该是文件名。我不认为我们可以将“/”作为文件名本身的字符
    【解决方案2】:

    获取文件名的简单方法

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

    添加此代码并打印 strFileName 后,您将得到 strFileName = 1414240995236.jpg

    【讨论】:

      【解决方案3】:

      最简单的解决方案是使用Uri.getLastPathSegment()

      String filename = uri.getLastPathSegment();
      

      【讨论】:

      • @manimcaAndroidDeveloper 一定要通过投票表示感谢并接受我的回答(当计时器用完时)。
      • 你确定。但我无法获得文件名。我得到了这样的答案。 /storage/sdcard/DCIM/Camera/1414302043784.jpg
      • @manimcaAndroidDeveloper 给出该结果的确切代码是什么?
      • String CapturedImageDetails = imageUri.getLastPathSegment();我使用了这个代码。你明白吗?
      • @manimcaAndroidDeveloper 你怎么看这个CapturedImageDetails的价值?
      【解决方案4】:

      FilenameUtils 救援:

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

      【讨论】:

      【解决方案5】:

      我们可以在代码下面找到文件名:

      File file =new File(Path);
      String filename=file.getName();
      

      【讨论】:

        【解决方案6】:

        旧线程,但我想我会更新;

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

        更多信息可以在这里找到; Android File Class

        【讨论】:

          【解决方案7】:

          最终工作解决方案:

           public static String getFileName(Uri uri) {
              try {
                  String path = uri.getLastPathSegment();
                  return path != null ? path.substring(path.lastIndexOf("/") + 1) : "unknown";
          
              } catch (Exception e) {
                  e.printStackTrace();
              }
          
              return "unknown";
          }
          

          【讨论】:

            【解决方案8】:

            假设你有绝对路径,在 kotlin 中的一个线性解决方案

            File(currentPhotoPath).name
            

            【讨论】:

              【解决方案9】:

              您可以使用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
              

              【讨论】:

              • 不幸的是,在运行时很多人都得到这个:“java.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/commons/io/FilenameUtils;”
              【解决方案10】:

              其他方式是:

              String[] parts = selectedFilePath.split("/");
                  final String fileName = parts[parts.length-1];
              

              【讨论】:

                【解决方案11】:

                添加这个库

                  implementation group: 'commons-io', name: 'commons-io', version: '2.6'
                

                然后调用FilenameUtils

                   val getFileName = FilenameUtils.getName("Your File path")
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2023-03-26
                  • 1970-01-01
                  • 2016-02-02
                  • 1970-01-01
                  • 2012-01-21
                  • 2012-10-25
                  • 1970-01-01
                  相关资源
                  最近更新 更多