2012-03-20 2 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 Private? от пользователя? –

ответ

1
public synchronized static String id(Context context) 

возвращает постоянную UUID (генерируемый UUID.randomUUID()). Другими словами, он будет возвращать один и тот же UUID каждый раз. Как ответил @Alonso Domiguez, это, вероятно, идентификатор установки, основанный на именовании. Цель состоит в том, чтобы предоставить каждому экземпляру приложения, который использует этот код, уникальный идентификатор.

Хитрость здесь

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

Функция:

writeInstallationFile(installation) 

генерирует случайный UUID, и пишет, что UUID на жесткий кодировкой файла. Однако он будет называться только один раз; потому что после первого вызова! install.exists() всегда будет ложным (поскольку запись UUID создает этот файл).

+0

Итак, я понимаю, что код записывает UUID в файл, если он никогда не был создан на телефоне. Я искал через свою SD-карту телефона, и я не вижу в нем конкретного файла с UUID. Однако есть одна папка, которая не читается, является ли UUID Private? от пользователя? –

+0

Файл создается в том месте, которое находится в папке context.getFilesDir(), с именем INSTALLATION (которое на самом деле является (возможно, постоянной) переменной где-то в коде). Если вы хотите посмотреть, где это, вы можете попробовать вставить оператор журнала с этими двумя значениями - возможно (хотя я точно не знаю), что файлы скрыты от проводника SD-карт. – mfrankli

+0

Хорошо, так что все, что я получил, это сделать запись, когда программа запустилась, поскольку из того, что я могу сказать, программа не входит ни в один из методов. –

1

С моей точки зрения, это возвращает UUID в установке, не «UUID в файл», как такая вещь не существует.

UUID генерируется при первом попытке получить этот идентификатор для установки и хранится внутри файла, поэтому дальнейшие вызовы с использованием того же контекста возвратят этот ранее сгенерированный UUID.

1

Код возвращает случайный UUID, который сохраняется в файле. Если UUID уже сформировалась она считывает из файла, в противном случае он создает его случайно, а затем сохраняет его в файл

Смежные вопросы