2010-05-14 2 views
28

나는 어떤 방법을 시도하지만 성공하지는 않습니다. 도와주세요.android에서 앱 설치 시간을 얻는 방법

위의 API 레벨 9 (진저 브레드)과에서
+18

당신이 말하는 단어를 몇백 개 추가해도 될까요? – CommonsWare

+3

그는 앱이 설치되었을 때 알고 싶어한다고 생각합니다. – Macarse

+0

나에게 말해주는 List 응용 프로그램을 설치하는 방법, 사용자, nou 시스템에 의해 설치됩니다. – jezz

답변

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

감사합니다, 그것은 내 원하는 것입니다. – jezz

+5

또한 마지막 설치 *** 또는 업데이트 *** 시간이 표시되어야합니다. – orip

+6

업데이트 시간이 아닌 실제 최초 설치 시간은 어떨까요? –

47

은 시대 이후의 밀리 초를 들고 PackageInfo.firstInstallTime 필드있다 :

packageManager.getPackageInfo(packageName, 0).firstInstallTime; 

나는 가능하다면 그것을 사용하고, 다시 가을에 다음과 같은 코드를 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 당신에게 "유닉스 시간"에서 설치 시간 (시간을 제공합니다 내가 n 시간은 "신기원", 즉 1 월 1 일 00:00:00:00 UTC입니다. 이 시간을 포맷하려면 java.util.Date 또는 java.text.DateFormat을 사용할 수 있습니다.

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

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

형제 님, 감사합니다. – vinidog

+1

packagemanager에서 "PackageManager.GET_PERMISSIONS"를 요청하는 불필요한 경우 (2 번만 "0"을 전달) – for3st

관련 문제