2010-05-14 6 views

risposta

52
PackageManager pm = context.getPackageManager(); 
ApplicationInfo appInfo = pm.getApplicationInfo("app.package.name", 0); 
String appFile = appInfo.sourceDir; 
long installed = new File(appFile).lastModified(); //Epoch Time 
+0

grazie, è il mio desiderio. – jezz

+5

Inoltre, dovrebbe mostrare l'ultima volta l'installazione *** o l'ora di aggiornamento ***. – orip

+6

E il tempo effettivo di prima installazione e NON il tempo di aggiornamento? –

47

Nel livello API 9 (Gingerbread) e sopra, c'è il campo PackageInfo.firstInstallTime, tiene millisecondi dall'epoca:

packageManager.getPackageInfo(packageName, 0).firstInstallTime; 

Ho il seguente codice di usarlo, se disponibile, e ricadere la data di modifica apk:

// return install time from package manager, or apk file modification time, 
// or null if not found 
public Date getInstallTime(
    PackageManager packageManager, String packageName) { 
    return firstNonNull(
    installTimeFromPackageManager(packageManager, packageName), 
    apkUpdateTime(packageManager, packageName)); 
} 

private Date apkUpdateTime(
    PackageManager packageManager, String packageName) { 
    try { 
    ApplicationInfo info = packageManager.getApplicationInfo(packageName, 0); 
    File apkFile = new File(info.sourceDir); 
    return apkFile.exists() ? new Date(apkFile.lastModified()) : null; 
    } catch (NameNotFoundException e) { 
    return null; // package not found 
    } 
} 

private Date installTimeFromPackageManager(
    PackageManager packageManager, String packageName) { 
    // API level 9 and above have the "firstInstallTime" field. 
    // Check for it with reflection and return if present. 
    try { 
    PackageInfo info = packageManager.getPackageInfo(packageName, 0); 
    Field field = PackageInfo.class.getField("firstInstallTime"); 
    long timestamp = field.getLong(info); 
    return new Date(timestamp); 
    } catch (NameNotFoundException e) {   
    return null; // package not found 
    } catch (IllegalAccessException e) { 
    } catch (NoSuchFieldException e) { 
    } catch (IllegalArgumentException e) { 
    } catch (SecurityException e) { 
    } 
    // field wasn't found 
    return null; 
} 

private Date firstNonNull(Date... dates) { 
    for (Date date : dates) 
    if (date != null) 
     return date; 
    return null; 
} 
10

PackageInfo.firstInstallTime ti dà il tempo di installazione in "tempo Unix" (il tempo che ho n millisecondi dal "l'epoca", ad esempio 1 ° gennaio 1970 00:00:00 UTC). È possibile utilizzare java.util.Date o java.text.DateFormat per formattare questa volta.

private static final String TAG = "MyActivity"; 

... 
packageName = ... 
... 

try { 
    PackageInfo packageInfo = pm.getPackageInfo(packageName, PackageManager.GET_PERMISSIONS); 

    Date installTime = new Date(packageInfo.firstInstallTime); 
    Log.d(TAG, "Installed: " + installTime.toString()); 

    Date updateTime = new Date(packageInfo.lastUpdateTime); 
    Log.d(TAG, "Updated: " + updateTime.toString()); 
} 
catch (PackageManager.NameNotFoundException e) { 
    e.printStackTrace(); 
} 

È inoltre possibile modificare il formato della data con java.text.SimpleDateFormat.

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 

String installTime = dateFormat.format(new Date(packageInfo.firstInstallTime)); 
Log.d(TAG, "Installed: " + installTime); 

String updateTime = dateFormat.format(new Date(packageInfo.lastUpdateTime)); 
Log.d(TAG, "Updated: " + updateTime); 
+1

Grazie fratello, ha funzionato bene. – vinidog

+1

Non è necessario richiedere "PackageManager.GET_PERMISSIONS" dal packagemanager se si desidera solo quei 2 volte (basta passare "0") – for3st

Problemi correlati