13

Using Lookout app (https://play.google.com/store/apps/details?id=com.lookout), I see every time I install or upgrade app, it'll automatically scan this app to ensure it's not malicious.

Follow Lookout, I write a simple app which listen broadcast message whenever each app is installed or upgraded. AFAIK, there are some type of IntentFilter for broadcast message, it is:

  • Intent.ACTION_PACKAGE_ADDED
  • Intent.ACTION_PACKAGE_CHANGED
  • Intent.ACTION_PACKAGE_INSTALL

I hope Intent.ACTION_PACKAGE_ADDED is the answer but it's wrong (ACTION_PACKAGE_ADDED: A new application package has been installed on the device. The data contains the name of the package. Note that the newly installed package does not receive this broadcast.) while ACTION_PACKAGE_INSTALL is deprecated.

Can anyone tell me a better way? Any help is welcome.

jww
  • 97,681
  • 90
  • 411
  • 885
anticafe
  • 6,816
  • 9
  • 43
  • 74
  • why is `ACTION_PACKAGE_ADDED` wrong? – zapl Apr 24 '12 at 11:50
  • 1
    Because "Note that the newly installed package does not receive this broadcast"; – anticafe Apr 24 '12 at 11:52
  • 1
    You don't get the message yourself if you was just installed. That's not what you want I guess. – zapl Apr 24 '12 at 11:55
  • 1
    zapi is correct -- you cannot use `ACTION_PACKAGE_ADDED` to find out about your own app being installed. – CommonsWare Apr 24 '12 at 12:12
  • AFAIK, This is quite difficult to get broadcast at the time of installation. But I have some trick may be this will help you. If you set some other broadcast receiver which can frequently calls in the application like Battery status, Phone state, wifi-state changed and some more so that there is possibility that you can get at least one of the broadcast receive so you can work at the time. – Dharmendra May 03 '12 at 19:36
  • I sincerely hope that the newly installed app will never receive ACTION_PACKAGE_ADDED broadcasts, since it can be used to startup an app upon installation. Imagine the ways this could be exploited by malware. – Nar Gar May 31 '12 at 02:58

5 Answers5

14

If you are installing an application A, all other applications on the device will get the Intent that application A is the newly installed application but not A itself as it doesn't seem of any use. Now A will get broadcasts if other apps are later installed or changed.

If you want to find out at when your app was installed or some other app's the last install or update time, you can always use PackageManager:

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

here app.package.name is the package name of the app you want to find out the install time. If you want to use it for your app, pass in your app's package name.

MathieuMaree
  • 7,453
  • 6
  • 26
  • 31
Akhil
  • 13,888
  • 7
  • 35
  • 39
  • post if you have any specific queries or something about what do you want to achieve. – Akhil May 03 '12 at 09:52
  • 2
    From what I see in Lookout, they also have a FileSystemMonitorService to keep track of new installed apps. Maybe it's similar what's in your answer. In fact I think in Android, there is no broadcast message to keep track of new installed app. But using your way, it's possible. – anticafe May 04 '12 at 03:03
8

You can try this receiver and permission. (But this seem only work in /system/app)^^"

<receiver
    android:name="com.your.receiver"
    android:enabled="true"
    android:exported="true" >
            <intent-filter>
                <action android:name="android.intent.action.PACKAGE_ADDED" />
                <action android:name="android.intent.action.PACKAGE_REMOVED" />
                    <data android:scheme="package"/> 
                </intent-filter>
 </receiver>
 <uses-permission android:name="android.permission.BROADCAST_PACKAGE_REMOVED" />
Deyu瑜
  • 484
  • 4
  • 14
2

Android won't send your a broadcast that you're being installed, but Google Play will. This won't help if your app is loaded through Amazon or through the debugger, but it does allow you to run code if your app is installed through Google Play: https://developers.google.com/android/reference/com/google/android/gms/tagmanager/InstallReferrerReceiver

JohnnyLambada
  • 12,700
  • 11
  • 57
  • 61
0

You need to have two applications, one of them monitors the other app's installation and upgrades.

Ron
  • 24,175
  • 8
  • 56
  • 97
0

insipred by @Akhil I got a better idea

 val pm = packageManager
 val pkgInfo = pm.getPackageInfo(packageName, 0)
 VLog.e("vvv", "firstInstallTime=${pkgInfo.firstInstallTime}")
 VLog.e("vvv", "lastUpdateTime=${pkgInfo.lastUpdateTime}")
JiangNan
  • 1
  • 1