2012-03-20 160 views
1

需要幫助的種類瞭解此代碼實際輸出的內容。它是否把一個uuid文件? 我發現它http://android-developers.blogspot.com/2011/03/identifying-app-installations.html瞭解此代碼

public synchronized static String id(Context context) { 
     if (sID == null) { 
      File installation = new File(context.getFilesDir(), INSTALLATION); 
      try { 
       if (!installation.exists()) 
        writeInstallationFile(installation); 
       sID = readInstallationFile(installation); 
      } catch (Exception e) { 
       throw new RuntimeException(e); 
      } 
     } 
     return sID; 
    } 

    private static String readInstallationFile(File installation) throws IOException { 
     RandomAccessFile f = new RandomAccessFile(installation, "r"); 
     byte[] bytes = new byte[(int) f.length()]; 
     f.readFully(bytes); 
     f.close(); 
     return new String(bytes); 
    } 

    private static void writeInstallationFile(File installation) throws IOException { 
     FileOutputStream out = new FileOutputStream(installation); 
     String id = UUID.randomUUID().toString(); 
     out.write(id.getBytes()); 
     out.close(); 
    } 
} 

它究竟是如何張貼在我的應用程序的代碼。

package com.UUIID; 

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import android.util.Log; 
import java.io.RandomAccessFile; 
import java.util.UUID; 

import android.app.Activity; 
import android.content.Context; 
import android.os.Bundle; 
import android.widget.TextView; 

public class UUIDActivity extends Activity { 
    /** Called when the activity is first created. */ 
    TextView text; 
    private static final String TAG = "Installation"; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     Log.d(TAG, "program started"); 
     text = (TextView) findViewById(R.id.textfield); 

    } 

    class Installation { 

     private String sID = null; 
     private static final String INSTALLATION = "INSTALLATION"; 

     public synchronized String id(Context context) { 
      if (sID == null) { 
       File installation = new File(context.getFilesDir(), 
         INSTALLATION); 
       try { 

        if (!installation.exists()) 
         writeInstallationFile(installation); 
        Log.d(TAG, "Inside of installation If statement"); 
        sID = readInstallationFile(installation); 
       } catch (Exception e) { 
        throw new RuntimeException(e); 
       } 
      } 
      return sID; 
     } 

     private String readInstallationFile(File installation) 
       throws IOException { 
      RandomAccessFile f = new RandomAccessFile(installation, "r"); 
      byte[] bytes = new byte[(int) f.length()]; 
      f.readFully(bytes); 
      Log.d(TAG, "Right before it calls f to close"); 
      f.close(); 
      return new String(bytes); 
     } 

     private void writeInstallationFile(File installation) 
       throws IOException { 
      FileOutputStream out = new FileOutputStream(installation); 
      String id = UUID.randomUUID().toString(); 
      Log.d(TAG, "Right before the file gets written out."); 
      out.write(id.getBytes()); 
      out.close(); 
     } 
    } 
} 
+0

好吧,所以我明白代碼將UUID寫入文件,如果它從未在手機上創建過。我搜索了我的手機SD卡,我沒有看到任何具有UUID的特定文件。但是,有一個文件夾無法讀取,UUID是否是專用的?從甚至用戶? – 2012-03-20 19:42:08

回答

1
public synchronized static String id(Context context) 

返回一個持久的UUID(由UUID.randomUUID產生的())。換句話說,它每次都會返回相同的UUID。正如@Alonso Domiguez回答的那樣,這可能是一個基於命名的安裝ID。目標是爲使用此代碼的應用程序的每個實例提供一個唯一的ID。

訣竅這裏是

if (!installation.exists()) 
    writeInstallationFile(installation); 
sID = readInstallationFile(installation); 

功能:

writeInstallationFile(installation) 

產生一個隨機UUID,並寫道,UUID到一個硬編碼的文件。但是,它只會被調用一次;因爲在第一次調用之後,!installation.exists()將始終爲false(因爲寫入UUID會創建該文件)。

+0

好吧,所以我明白代碼將UUID寫入文件,如果它從未在手機上創建過。我搜索了我的手機SD卡,我沒有看到任何具有UUID的特定文件。但是,有一個文件夾無法讀取,UUID是否是專用的?從甚至用戶? – 2012-03-20 23:24:45

+0

該文件在位於文件夾context.getFilesDir()中的位置創建,名稱爲INSTALLATION(實際上是代碼中的某個位置(可能是常量))。如果你想知道它在哪裏,你可以嘗試插入一個帶有這兩個值的Log語句 - 這是可以想象的(儘管我不知道)SD文件夾中的文件是隱藏的。 – mfrankli 2012-03-20 23:32:19

+0

好的,所以我所要做的就是記錄程序何時開始,因爲我可以告訴程序沒有進入任何方法。 – 2012-03-21 04:06:03

1

從我的角度來看,它返回安裝的UUID,而不是「一個UUID到文件」這樣的事情不存在。

第一次嘗試獲取安裝ID並存儲在文件中時,會生成UUID,因此使用相同上下文的進一步調用將返回以前生成的UUID。

1

該代碼返回一個隨機的UUID,該UUID被保存到一個文件中。如果UUID已經產生它從文件中讀取它,否則它會創建它隨機,然後將其保存到文件