2016-04-06 13 views
1

Kürzlich mache ich App Angebote mit Speichern von Bild und Laden von Bild auf externen Speicher. Ich bin ziemlich verwirrt mit Uri, File und StringPath. Wenn Sie beispielsweise ein Bild aus der Galerie laden, wird Uri verwendet.Uri vs Datei vs StringPath in Android

if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) { //Browse Gallery is requested 
    //Get the path for selected image in Gallery 
    Uri selectedImage = data.getData(); 
    String[] filePathColumn = { MediaStore.Images.Media.DATA }; 

    //Access Gallery according to the path 
    Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null); 
    cursor.moveToFirst(); 

    int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
    String picturePath = cursor.getString(columnIndex); 
    cursor.close(); 

    loadImage(picturePath);   //load picture according the path 
    image_View.setImageBitmap(pic); //Show the selected picture 
} 

Dann, wenn dekodieren das Bild, verwendet es StringPath.

private void loadImage(String picturePath) { 
    final BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inJustDecodeBounds = true; 

    BitmapFactory.decodeFile(picturePath,options); 
    int height_ = options.outHeight; 
    int width_ = options.outWidth; 
    float ratio = width_/height_; 
    int width = 480; 
    int height = 480; 
    if(width_>height_){ 
     height = Math.round(width/ratio); 
    }else{ 
     width = Math.round(width*ratio); 
    } 

    options.inSampleSize = calculateInSampleSize(options, width, height); 
    options.inJustDecodeBounds = false; 
    pic=BitmapFactory.decodeFile(picturePath,options); 
} 

Dann, wenn Byte aus der Datei lesen, verwendet es File.

File cacheDir = getBaseContext().getCacheDir(); 
//Form a directory with a file named "pic" 
File f = new File(cacheDir, "pic"); 

try { 
    //Prepare output stream that write byte to the directory 
    FileOutputStream out = new FileOutputStream(f); 
    //Save the picture to the directory 
    pic.compress(Bitmap.CompressFormat.JPEG, 100, out); 
    out.flush(); 
    out.close(); 
} catch (FileNotFoundException e) { 
    e.printStackTrace(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

Also, was ist der Unterschied? Ist es nur in der Verwendung anders, aber dasselbe Verzeichnis darstellen?

Antwort

2

Inhalt sieht URI so etwas wie:

content://media/external/images/media/53 

Die Rolle der ContentResolver hier ist, dass Sie auf das Bild, einen Zugriff erhalten auf der Grundlage dieser URI, brauchen Sie nicht den Dateinamen oder andere Eigenschaften des wissen Datei, Sie brauchen nur diesen URI, um auf das Bild zuzugreifen.

String Pfad ist die physikalische Adresse des Bildes, das gespeichert, die wie folgt aussieht:

file:///mnt/sdcard/myimage.jpg 

und schließlich Datei ist der niedrigste Handler, die Sie mit Dateien arbeiten müssen. Es verwendet den String Path als Argument zum Erstellen oder Öffnen der Datei zum Lesen/Schreiben.

In Ihrem bereitgestellt Beispiel hier ist der Fortschritt:

1- Sie ContentResolver fragen Sie die reale Dateipfad auf der mitgelieferten URI

2- Sie eine Bitmap-Datei zu einem pic Objekt laden Basis zu geben, basierend auf dem mitgelieferten Pfad

3- Sie eine Datei mit dem Namen „pic“ erstellen und das pic Objekt zu JPG komprimiert und es

+0

Vielen Dank für Ihre Erklärung schreiben. Kannst du mir helfen, einen Blick auf http://stackoverflow.com/questions/36466483/how-the-codes-work-for-loading-image-from-gallery-android – SamTew

+0

@SamTew Ich beantwortete Ihre Frage dort – Pooya

+0

I habe nicht gemerkt, dass die Person, die sie beantwortet, du bist. Vielen Dank – SamTew