Showing
7 changed files
with
492 additions
and
4 deletions
... | @@ -4,8 +4,10 @@ | ... | @@ -4,8 +4,10 @@ |
4 | <component name="GradleSettings"> | 4 | <component name="GradleSettings"> |
5 | <option name="linkedExternalProjectsSettings"> | 5 | <option name="linkedExternalProjectsSettings"> |
6 | <GradleProjectSettings> | 6 | <GradleProjectSettings> |
7 | + <compositeConfiguration> | ||
8 | + <compositeBuild compositeDefinitionSource="SCRIPT" /> | ||
9 | + </compositeConfiguration> | ||
7 | <option name="delegatedBuild" value="false" /> | 10 | <option name="delegatedBuild" value="false" /> |
8 | - <option name="testRunner" value="PLATFORM" /> | ||
9 | <option name="distributionType" value="DEFAULT_WRAPPED" /> | 11 | <option name="distributionType" value="DEFAULT_WRAPPED" /> |
10 | <option name="externalProjectPath" value="$PROJECT_DIR$" /> | 12 | <option name="externalProjectPath" value="$PROJECT_DIR$" /> |
11 | <option name="modules"> | 13 | <option name="modules"> |
... | @@ -15,6 +17,7 @@ | ... | @@ -15,6 +17,7 @@ |
15 | </set> | 17 | </set> |
16 | </option> | 18 | </option> |
17 | <option name="resolveModulePerSourceSet" value="false" /> | 19 | <option name="resolveModulePerSourceSet" value="false" /> |
20 | + <option name="testRunner" value="PLATFORM" /> | ||
18 | </GradleProjectSettings> | 21 | </GradleProjectSettings> |
19 | </option> | 22 | </option> |
20 | </component> | 23 | </component> | ... | ... |
source/DataExtraction/.idea/vcs.xml
0 → 100644
... | @@ -5,8 +5,8 @@ android { | ... | @@ -5,8 +5,8 @@ android { |
5 | buildToolsVersion "29.0.2" | 5 | buildToolsVersion "29.0.2" |
6 | defaultConfig { | 6 | defaultConfig { |
7 | applicationId "com.example.dataextraction" | 7 | applicationId "com.example.dataextraction" |
8 | - minSdkVersion 28 | 8 | + minSdkVersion 23 |
9 | - targetSdkVersion 29 | 9 | + targetSdkVersion 28 |
10 | versionCode 1 | 10 | versionCode 1 |
11 | versionName "1.0" | 11 | versionName "1.0" |
12 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" | 12 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" | ... | ... |
1 | <?xml version="1.0" encoding="utf-8"?> | 1 | <?xml version="1.0" encoding="utf-8"?> |
2 | <manifest xmlns:android="http://schemas.android.com/apk/res/android" | 2 | <manifest xmlns:android="http://schemas.android.com/apk/res/android" |
3 | + xmlns:tools="http://schemas.android.com/tools" | ||
3 | package="com.example.dataextraction"> | 4 | package="com.example.dataextraction"> |
4 | - | 5 | + <uses-permission |
6 | + android:name="android.permission.PACKAGE_USAGE_STATS" | ||
7 | + tools:ignore="ProtectedPermissions" /> | ||
5 | <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> | 8 | <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> |
6 | <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> | 9 | <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> |
7 | <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> | 10 | <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> |
8 | <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> | 11 | <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> |
9 | <uses-permission android:name="android.permission.READ_CALENDAR" /> | 12 | <uses-permission android:name="android.permission.READ_CALENDAR" /> |
13 | + <uses-permission android:name="android.permission.READ_CONTACTS" /> | ||
14 | + <uses-permission android:name="android.permission.READ_CALL_LOG" /> | ||
15 | + <uses-permission android:name="android.permission.READ_SMS" /> | ||
16 | + <uses-permission android:name="android.permission.READ_PHONE_STATE" /> | ||
17 | + <uses-permission android:name="android.permission.GET_ACCOUNTS" /> | ||
18 | + <uses-permission android:name="android.permission.INTERNET" /> | ||
19 | + <uses-permission android:name="android.permission.READ_PHONE_NUMBERS" /> | ||
10 | 20 | ||
11 | <application | 21 | <application |
12 | android:allowBackup="true" | 22 | android:allowBackup="true" | ... | ... |
... | @@ -5,6 +5,7 @@ import android.content.Context; | ... | @@ -5,6 +5,7 @@ import android.content.Context; |
5 | import android.database.SQLException; | 5 | import android.database.SQLException; |
6 | import android.database.sqlite.SQLiteDatabase; | 6 | import android.database.sqlite.SQLiteDatabase; |
7 | import android.database.sqlite.SQLiteOpenHelper; | 7 | import android.database.sqlite.SQLiteOpenHelper; |
8 | +import android.util.Log; | ||
8 | 9 | ||
9 | import androidx.annotation.Nullable; | 10 | import androidx.annotation.Nullable; |
10 | 11 | ||
... | @@ -27,6 +28,13 @@ public class DBHelper { | ... | @@ -27,6 +28,13 @@ public class DBHelper { |
27 | db.execSQL(VideoDataBase.CreateDB._CREATE0); | 28 | db.execSQL(VideoDataBase.CreateDB._CREATE0); |
28 | db.execSQL(AudioDataBase.CreateDB._CREATE0); | 29 | db.execSQL(AudioDataBase.CreateDB._CREATE0); |
29 | db.execSQL(CalendarDataBase.CreateDB._CREATE0); | 30 | db.execSQL(CalendarDataBase.CreateDB._CREATE0); |
31 | + db.execSQL(Databases.CreateDB_App._CREATE_AppInfo); | ||
32 | + db.execSQL(Databases.CreateDB_AccountInfo._CREATE_AccountInfo); | ||
33 | + db.execSQL(Databases.CreateDB_AppUsage_YEAR._CREATE_AppUsage_YEAR); | ||
34 | + db.execSQL(Databases.CreateDB_AppUsage_MONTH._CREATE_AppUsage_MONTH); | ||
35 | + db.execSQL(Databases.CreateDB_AppUsage_WEEK._CREATE_AppUsage_WEEK); | ||
36 | + db.execSQL(Databases.CreateDB_AppUsage_DAY._CREATE_AppUsage_DAY); | ||
37 | + db.execSQL(Databases.CreateDB_PhoneInfo._CREATE_PhoneInfo); | ||
30 | } | 38 | } |
31 | 39 | ||
32 | @Override | 40 | @Override |
... | @@ -35,6 +43,14 @@ public class DBHelper { | ... | @@ -35,6 +43,14 @@ public class DBHelper { |
35 | db.execSQL("DROP TABLE IF EXISTS " + VideoDataBase.CreateDB._TABLENAME0); | 43 | db.execSQL("DROP TABLE IF EXISTS " + VideoDataBase.CreateDB._TABLENAME0); |
36 | db.execSQL("DROP TABLE IF EXISTS " + AudioDataBase.CreateDB._TABLENAME0); | 44 | db.execSQL("DROP TABLE IF EXISTS " + AudioDataBase.CreateDB._TABLENAME0); |
37 | db.execSQL("DROP TABLE IF EXISTS " + CalendarDataBase.CreateDB._TABLENAME0); | 45 | db.execSQL("DROP TABLE IF EXISTS " + CalendarDataBase.CreateDB._TABLENAME0); |
46 | + db.execSQL("DROP TABLE IF EXISTS " + Databases.CreateDB_App.TABLE_NAME); | ||
47 | + db.execSQL("DROP TABLE IF EXISTS " + Databases.CreateDB_AccountInfo.TABLE_NAME); | ||
48 | + db.execSQL("DROP TABLE IF EXISTS " + Databases.CreateDB_AppUsage_YEAR.TABLE_NAME); | ||
49 | + db.execSQL("DROP TABLE IF EXISTS " + Databases.CreateDB_AppUsage_MONTH.TABLE_NAME); | ||
50 | + db.execSQL("DROP TABLE IF EXISTS " + Databases.CreateDB_AppUsage_WEEK.TABLE_NAME); | ||
51 | + db.execSQL("DROP TABLE IF EXISTS " + Databases.CreateDB_AppUsage_DAY.TABLE_NAME); | ||
52 | + db.execSQL("DROP TABLE IF EXISTS " + Databases.CreateDB_PhoneInfo.TABLE_NAME); | ||
53 | + | ||
38 | onCreate(db); | 54 | onCreate(db); |
39 | } | 55 | } |
40 | } | 56 | } |
... | @@ -122,4 +138,113 @@ public class DBHelper { | ... | @@ -122,4 +138,113 @@ public class DBHelper { |
122 | values.put(CalendarDataBase.CreateDB.RDATE, r_date); | 138 | values.put(CalendarDataBase.CreateDB.RDATE, r_date); |
123 | return mDB.insert(CalendarDataBase.CreateDB._TABLENAME0, null, values); | 139 | return mDB.insert(CalendarDataBase.CreateDB._TABLENAME0, null, values); |
124 | } | 140 | } |
141 | + | ||
142 | + //Package 정보에 Network 사용량 추가 | ||
143 | + public void addAppInfo(String packageName, String versionName, String applicationName | ||
144 | + , long firstInstallTime, long lastUpdateTime, long wifibytes, long cellularbytes) { | ||
145 | + SQLiteDatabase db = mDBHelper.getWritableDatabase(); | ||
146 | + String wifi = String.valueOf(wifibytes); | ||
147 | + String cellular = String.valueOf(cellularbytes); | ||
148 | + ContentValues values = new ContentValues(); | ||
149 | + values.put(Databases.CreateDB_App.PACKAGENAME, packageName); | ||
150 | + values.put(Databases.CreateDB_App.VERSION, versionName); | ||
151 | + values.put(Databases.CreateDB_App.NAME, applicationName); | ||
152 | + values.put(Databases.CreateDB_App.FIRSTINSTALL, firstInstallTime); | ||
153 | + values.put(Databases.CreateDB_App.LASTUPDATE, lastUpdateTime); | ||
154 | + values.put(Databases.CreateDB_App.WIFIUSAGE, wifibytes); | ||
155 | + values.put(Databases.CreateDB_App.CELLULARUSAGE, cellularbytes); | ||
156 | + db.insert(Databases.CreateDB_App.TABLE_NAME, null, values); | ||
157 | + | ||
158 | + Log.d("LogTest","addAppUsage"); | ||
159 | + | ||
160 | + Log.d("LogTest", String.valueOf(cellularbytes)); | ||
161 | + } | ||
162 | + public void addAccountInfo(String accountname, String accounttype) { | ||
163 | + SQLiteDatabase db = mDBHelper.getWritableDatabase(); | ||
164 | + ContentValues values = new ContentValues(); | ||
165 | + values.put(Databases.CreateDB_AccountInfo.ACCOUNTNAME, accountname); | ||
166 | + values.put(Databases.CreateDB_AccountInfo.ACCOUNTTYPE, accounttype); | ||
167 | + db.insert(Databases.CreateDB_AccountInfo.TABLE_NAME, null, values); | ||
168 | + Log.d("LogTest","addAccountInfo"); | ||
169 | + } | ||
170 | + | ||
171 | + public void addAppUsage_YEAR(String packageName, long firsttimestamp, long lasttimestamp, | ||
172 | + long lasttimeused, long totaltimeforeground) { | ||
173 | + SQLiteDatabase db = mDBHelper.getWritableDatabase(); | ||
174 | + ContentValues values = new ContentValues(); | ||
175 | + values.put(Databases.CreateDB_AppUsage_YEAR.PACKAGENAME, packageName); | ||
176 | + values.put(Databases.CreateDB_AppUsage_YEAR.FIRSTTIMESTAMP, firsttimestamp); | ||
177 | + values.put(Databases.CreateDB_AppUsage_YEAR.LASTIMESTAMP, lasttimestamp); | ||
178 | + values.put(Databases.CreateDB_AppUsage_YEAR.LASTTIMEUSED, lasttimeused); | ||
179 | + values.put(Databases.CreateDB_AppUsage_YEAR.TOTALTIMEFOREGROUND, totaltimeforeground); | ||
180 | + db.insert(Databases.CreateDB_AppUsage_YEAR.TABLE_NAME, null, values); | ||
181 | + Log.d("LogTest","addAppUsageYear"); | ||
182 | + } | ||
183 | + | ||
184 | + public void addAppUsage_MONTH(String packageName, long firsttimestamp, long lasttimestamp, | ||
185 | + long lasttimeused, long totaltimeforeground) { | ||
186 | + SQLiteDatabase db = mDBHelper.getWritableDatabase(); | ||
187 | + ContentValues values = new ContentValues(); | ||
188 | + values.put(Databases.CreateDB_AppUsage_MONTH.PACKAGENAME, packageName); | ||
189 | + values.put(Databases.CreateDB_AppUsage_MONTH.FIRSTTIMESTAMP, firsttimestamp); | ||
190 | + values.put(Databases.CreateDB_AppUsage_MONTH.LASTIMESTAMP, lasttimestamp); | ||
191 | + values.put(Databases.CreateDB_AppUsage_MONTH.LASTTIMEUSED, lasttimeused); | ||
192 | + values.put(Databases.CreateDB_AppUsage_MONTH.TOTALTIMEFOREGROUND, totaltimeforeground); | ||
193 | + db.insert(Databases.CreateDB_AppUsage_MONTH.TABLE_NAME, null, values); | ||
194 | + Log.d("LogTest","addAppUsageMonth"); | ||
195 | + } | ||
196 | + | ||
197 | + public void addAppUsage_WEEK(String packageName, long firsttimestamp, long lasttimestamp, | ||
198 | + long lasttimeused, long totaltimeforeground) { | ||
199 | + SQLiteDatabase db = mDBHelper.getWritableDatabase(); | ||
200 | + ContentValues values = new ContentValues(); | ||
201 | + values.put(Databases.CreateDB_AppUsage_WEEK.PACKAGENAME, packageName); | ||
202 | + values.put(Databases.CreateDB_AppUsage_WEEK.FIRSTTIMESTAMP, firsttimestamp); | ||
203 | + values.put(Databases.CreateDB_AppUsage_WEEK.LASTIMESTAMP, lasttimestamp); | ||
204 | + values.put(Databases.CreateDB_AppUsage_WEEK.LASTTIMEUSED, lasttimeused); | ||
205 | + values.put(Databases.CreateDB_AppUsage_WEEK.TOTALTIMEFOREGROUND, totaltimeforeground); | ||
206 | + db.insert(Databases.CreateDB_AppUsage_WEEK.TABLE_NAME, null, values); | ||
207 | + Log.d("LogTest","addAppUsageWeek"); | ||
208 | + } | ||
209 | + | ||
210 | + public void addAppUsage_DAY(String packageName, long firsttimestamp, long lasttimestamp, | ||
211 | + long lasttimeused, long totaltimeforeground) { | ||
212 | + SQLiteDatabase db = mDBHelper.getWritableDatabase(); | ||
213 | + ContentValues values = new ContentValues(); | ||
214 | + values.put(Databases.CreateDB_AppUsage_DAY.PACKAGENAME, packageName); | ||
215 | + values.put(Databases.CreateDB_AppUsage_DAY.FIRSTTIMESTAMP, firsttimestamp); | ||
216 | + values.put(Databases.CreateDB_AppUsage_DAY.LASTIMESTAMP, lasttimestamp); | ||
217 | + values.put(Databases.CreateDB_AppUsage_DAY.LASTTIMEUSED, lasttimeused); | ||
218 | + values.put(Databases.CreateDB_AppUsage_DAY.TOTALTIMEFOREGROUND, totaltimeforeground); | ||
219 | + db.insert(Databases.CreateDB_AppUsage_DAY.TABLE_NAME, null, values); | ||
220 | + Log.d("LogTest","addAppUsageDay"); | ||
221 | + } | ||
222 | + public void addPhoneInfo(int phonetype, String softwarenumber, String phonenumber, String subscriberid, | ||
223 | + String adid, int callstate, int datastate, | ||
224 | + int networktype, String networkcountryiso, String simcountryiso, | ||
225 | + String networkoperater, String simoperator, String networkoperatorname, | ||
226 | + String simoperatorname, String simserialnumber, int simstate, | ||
227 | + boolean isnetworkroming) { | ||
228 | + SQLiteDatabase db = mDBHelper.getWritableDatabase(); | ||
229 | + ContentValues values = new ContentValues(); | ||
230 | + values.put(Databases.CreateDB_PhoneInfo.PHONETYPE, phonetype); | ||
231 | + values.put(Databases.CreateDB_PhoneInfo.SOFTWARENUMBER, softwarenumber); | ||
232 | + values.put(Databases.CreateDB_PhoneInfo.PHONENUMBER, phonenumber); | ||
233 | + values.put(Databases.CreateDB_PhoneInfo.SUBSCRIBERID, subscriberid); | ||
234 | + values.put(Databases.CreateDB_PhoneInfo.ADID, adid); | ||
235 | + values.put(Databases.CreateDB_PhoneInfo.CALLSTATE, callstate); | ||
236 | + values.put(Databases.CreateDB_PhoneInfo.DATASTATE, datastate); | ||
237 | + values.put(Databases.CreateDB_PhoneInfo.NETWORKTYPE, networktype); | ||
238 | + values.put(Databases.CreateDB_PhoneInfo.NETWORKCOUNTRYISO, networkcountryiso); | ||
239 | + values.put(Databases.CreateDB_PhoneInfo.SIMCOUNTRYISO, simcountryiso); | ||
240 | + values.put(Databases.CreateDB_PhoneInfo.NETWORKOPERATER, networkoperater); | ||
241 | + values.put(Databases.CreateDB_PhoneInfo.SIMOPERATOR, simoperator); | ||
242 | + values.put(Databases.CreateDB_PhoneInfo.NETWORKOPERATORNAME, networkoperatorname); | ||
243 | + values.put(Databases.CreateDB_PhoneInfo.SIMOPERATORNAME, simoperatorname); | ||
244 | + values.put(Databases.CreateDB_PhoneInfo.SIMSERIALNUMBER, simserialnumber); | ||
245 | + values.put(Databases.CreateDB_PhoneInfo.SIMSTATE, simstate); | ||
246 | + values.put(Databases.CreateDB_PhoneInfo.ISNETWORKROMING, isnetworkroming); | ||
247 | + db.insert(Databases.CreateDB_PhoneInfo.TABLE_NAME, null, values); | ||
248 | + Log.d("LogTest","addPhoneInfo"); | ||
249 | + } | ||
125 | } | 250 | } | ... | ... |
1 | +package com.example.dataextraction; | ||
2 | + | ||
3 | +import android.provider.BaseColumns; | ||
4 | + | ||
5 | +import java.lang.reflect.Field; | ||
6 | + | ||
7 | +//데이터베이스 클래스 | ||
8 | +public final class Databases { | ||
9 | + | ||
10 | + private Databases() {} | ||
11 | + | ||
12 | + public static final class CreateDB_App implements BaseColumns { | ||
13 | + public static final String TABLE_NAME = "AppInfo"; | ||
14 | + public static final String PACKAGENAME = "packagename"; | ||
15 | + public static final String VERSION = "version"; | ||
16 | + public static final String NAME = "name"; | ||
17 | + public static final String FIRSTINSTALL = "firstinstall"; | ||
18 | + public static final String LASTUPDATE = "lastupdate"; | ||
19 | + public static final String WIFIUSAGE = "wifiusage"; | ||
20 | + public static final String CELLULARUSAGE = "cellularusage"; | ||
21 | + public static final String USAGETIME = "usagetime"; | ||
22 | + public static final String _CREATE_AppInfo = "create table if not exists "+TABLE_NAME+"(" | ||
23 | + +PACKAGENAME+" text not null primary key, " | ||
24 | + +VERSION+" text not null , " | ||
25 | + +NAME+" text not null , " | ||
26 | + +FIRSTINSTALL+" timestamp not null , " | ||
27 | + +LASTUPDATE+" timestamp not null , " | ||
28 | + +WIFIUSAGE+" bigint not null , " | ||
29 | + +CELLULARUSAGE+" bigint not null);"; | ||
30 | + } | ||
31 | + | ||
32 | + public static final class CreateDB_AppUsage_YEAR implements BaseColumns { | ||
33 | + public static final String TABLE_NAME = "AppUsageYear"; | ||
34 | + public static final String PACKAGENAME = "packagename"; | ||
35 | + public static final String FIRSTTIMESTAMP = "firsttimestamp"; | ||
36 | + public static final String LASTIMESTAMP = "lasttimestamp"; | ||
37 | + public static final String LASTTIMEUSED = "lasttimeused"; | ||
38 | + public static final String TOTALTIMEFOREGROUND = "totaltimeforeground"; | ||
39 | + public static final String _CREATE_AppUsage_YEAR = "create table if not exists "+TABLE_NAME+"(" | ||
40 | + +PACKAGENAME+" text not null , " | ||
41 | + +FIRSTTIMESTAMP+" timestamp not null , " | ||
42 | + +LASTIMESTAMP+" timestamp not null , " | ||
43 | + +LASTTIMEUSED+" timestamp not null , " | ||
44 | + +TOTALTIMEFOREGROUND+" bigint not null default 0, primary key(" +PACKAGENAME +"," + FIRSTTIMESTAMP+ "));"; | ||
45 | + } | ||
46 | + | ||
47 | + public static final class CreateDB_AppUsage_MONTH implements BaseColumns { | ||
48 | + public static final String TABLE_NAME = "AppUsageMonth"; | ||
49 | + public static final String PACKAGENAME = "packagename"; | ||
50 | + public static final String FIRSTTIMESTAMP = "firsttimestamp"; | ||
51 | + public static final String LASTIMESTAMP = "lasttimestamp"; | ||
52 | + public static final String LASTTIMEUSED = "lasttimeused"; | ||
53 | + public static final String TOTALTIMEFOREGROUND = "totaltimeforeground"; | ||
54 | + public static final String _CREATE_AppUsage_MONTH = "create table if not exists "+TABLE_NAME+"(" | ||
55 | + +PACKAGENAME+" text not null , " | ||
56 | + +FIRSTTIMESTAMP+" timestamp not null , " | ||
57 | + +LASTIMESTAMP+" timestamp not null , " | ||
58 | + +LASTTIMEUSED+" timestamp not null , " | ||
59 | + +TOTALTIMEFOREGROUND+" bigint not null default 0, primary key(" +PACKAGENAME +"," + FIRSTTIMESTAMP+ "));"; | ||
60 | + } | ||
61 | + | ||
62 | + public static final class CreateDB_AppUsage_WEEK implements BaseColumns { | ||
63 | + public static final String TABLE_NAME = "AppUsageWeek"; | ||
64 | + public static final String PACKAGENAME = "packagename"; | ||
65 | + public static final String FIRSTTIMESTAMP = "firsttimestamp"; | ||
66 | + public static final String LASTIMESTAMP = "lasttimestamp"; | ||
67 | + public static final String LASTTIMEUSED = "lasttimeused"; | ||
68 | + public static final String TOTALTIMEFOREGROUND = "totaltimeforeground"; | ||
69 | + public static final String _CREATE_AppUsage_WEEK = "create table if not exists "+TABLE_NAME+"(" | ||
70 | + +PACKAGENAME+" text not null , " | ||
71 | + +FIRSTTIMESTAMP+" timestamp not null , " | ||
72 | + +LASTIMESTAMP+" timestamp not null , " | ||
73 | + +LASTTIMEUSED+" timestamp not null , " | ||
74 | + +TOTALTIMEFOREGROUND+" bigint not null default 0, primary key(" +PACKAGENAME +"," + FIRSTTIMESTAMP+ "));"; | ||
75 | + } | ||
76 | + | ||
77 | + public static final class CreateDB_AppUsage_DAY implements BaseColumns { | ||
78 | + public static final String TABLE_NAME = "AppUsageDay"; | ||
79 | + public static final String PACKAGENAME = "packagename"; | ||
80 | + public static final String FIRSTTIMESTAMP = "firsttimestamp"; | ||
81 | + public static final String LASTIMESTAMP = "lasttimestamp"; | ||
82 | + public static final String LASTTIMEUSED = "lasttimeused"; | ||
83 | + public static final String TOTALTIMEFOREGROUND = "totaltimeforeground"; | ||
84 | + public static final String _CREATE_AppUsage_DAY = "create table if not exists "+TABLE_NAME+"(" | ||
85 | + +PACKAGENAME+" text not null , " | ||
86 | + +FIRSTTIMESTAMP+" timestamp not null , " | ||
87 | + +LASTIMESTAMP+" timestamp not null , " | ||
88 | + +LASTTIMEUSED+" timestamp not null , " | ||
89 | + +TOTALTIMEFOREGROUND+" bigint not null default 0, primary key(" +PACKAGENAME +"," + FIRSTTIMESTAMP+ "));"; | ||
90 | + } | ||
91 | + | ||
92 | + public static final class CreateDB_AccountInfo implements BaseColumns { | ||
93 | + public static final String TABLE_NAME = "AccountInfo"; | ||
94 | + public static final String ACCOUNTNAME = "accountname"; | ||
95 | + public static final String ACCOUNTTYPE = "accounttype"; | ||
96 | + public static final String _CREATE_AccountInfo = "create table if not exists "+TABLE_NAME+"(" | ||
97 | + +ACCOUNTNAME+" text not null , " | ||
98 | + +ACCOUNTTYPE+" text not null , primary key(" + ACCOUNTNAME + "," + ACCOUNTTYPE + ")) "; | ||
99 | + } | ||
100 | + | ||
101 | + public static final class CreateDB_PhoneInfo implements BaseColumns { | ||
102 | + public static final String TABLE_NAME = "PhoneInfo"; | ||
103 | + public static final String PHONETYPE = "phonetype"; | ||
104 | + public static final String SOFTWARENUMBER = "softwarenumber"; | ||
105 | + public static final String PHONENUMBER = "phonenumber"; | ||
106 | + public static final String SUBSCRIBERID = "subscriberid"; | ||
107 | + public static final String ADID = "adid"; | ||
108 | + public static final String CALLSTATE = "callstate"; | ||
109 | + public static final String DATASTATE = "datastate"; | ||
110 | + public static final String NETWORKTYPE = "networktype"; | ||
111 | + public static final String NETWORKCOUNTRYISO = "networkcountryiso"; | ||
112 | + public static final String SIMCOUNTRYISO = "simcountryiso"; | ||
113 | + public static final String NETWORKOPERATER = "networkoperater"; | ||
114 | + public static final String SIMOPERATOR = "simoperator"; | ||
115 | + public static final String NETWORKOPERATORNAME = "networkoperatorname"; | ||
116 | + public static final String SIMOPERATORNAME = "simoperatorname"; | ||
117 | + public static final String SIMSERIALNUMBER = "simserialnumber"; | ||
118 | + public static final String SIMSTATE = "simstate"; | ||
119 | + public static final String ISNETWORKROMING = "isnetworkroming"; | ||
120 | + | ||
121 | + public static final String _CREATE_PhoneInfo = "create table if not exists "+TABLE_NAME+"(" | ||
122 | + +PHONETYPE+" int not null primary key, " | ||
123 | + +SOFTWARENUMBER+" text , " | ||
124 | + +PHONENUMBER+" text , " | ||
125 | + +SUBSCRIBERID+" text , " | ||
126 | + +ADID+" text , " | ||
127 | + +CALLSTATE+" int , " | ||
128 | + +DATASTATE+" int , " | ||
129 | + +NETWORKTYPE+" int , " | ||
130 | + +NETWORKCOUNTRYISO+" text , " | ||
131 | + +SIMCOUNTRYISO+" text , " | ||
132 | + +NETWORKOPERATER+" text , " | ||
133 | + +SIMOPERATOR+" text , " | ||
134 | + +NETWORKOPERATORNAME+" text , " | ||
135 | + +SIMOPERATORNAME+" text , " | ||
136 | + +SIMSERIALNUMBER+" text , " | ||
137 | + +SIMSTATE+" int , " | ||
138 | + +ISNETWORKROMING +" bool ) "; | ||
139 | + } | ||
140 | +} |
... | @@ -3,8 +3,18 @@ package com.example.dataextraction; | ... | @@ -3,8 +3,18 @@ package com.example.dataextraction; |
3 | import androidx.appcompat.app.AppCompatActivity; | 3 | import androidx.appcompat.app.AppCompatActivity; |
4 | 4 | ||
5 | import android.Manifest; | 5 | import android.Manifest; |
6 | +import android.accounts.Account; | ||
7 | +import android.accounts.AccountManager; | ||
8 | +import android.app.AppOpsManager; | ||
9 | +import android.app.usage.NetworkStats; | ||
10 | +import android.app.usage.NetworkStatsManager; | ||
11 | +import android.app.usage.UsageStats; | ||
12 | +import android.app.usage.UsageStatsManager; | ||
6 | import android.content.ContentResolver; | 13 | import android.content.ContentResolver; |
7 | import android.content.Context; | 14 | import android.content.Context; |
15 | +import android.content.Intent; | ||
16 | +import android.content.pm.ApplicationInfo; | ||
17 | +import android.content.pm.PackageInfo; | ||
8 | import android.content.pm.PackageManager; | 18 | import android.content.pm.PackageManager; |
9 | import android.database.Cursor; | 19 | import android.database.Cursor; |
10 | import android.net.ConnectivityManager; | 20 | import android.net.ConnectivityManager; |
... | @@ -16,13 +26,17 @@ import android.net.NetworkInfo; | ... | @@ -16,13 +26,17 @@ import android.net.NetworkInfo; |
16 | import android.net.ProxyInfo; | 26 | import android.net.ProxyInfo; |
17 | import android.net.RouteInfo; | 27 | import android.net.RouteInfo; |
18 | import android.net.Uri; | 28 | import android.net.Uri; |
29 | +import android.os.AsyncTask; | ||
19 | import android.os.Build; | 30 | import android.os.Build; |
20 | import android.os.Bundle; | 31 | import android.os.Bundle; |
21 | import android.provider.CalendarContract; | 32 | import android.provider.CalendarContract; |
22 | import android.provider.MediaStore; | 33 | import android.provider.MediaStore; |
34 | +import android.telephony.TelephonyManager; | ||
35 | +import android.util.Log; | ||
23 | import android.view.View; | 36 | import android.view.View; |
24 | import android.widget.Toast; | 37 | import android.widget.Toast; |
25 | 38 | ||
39 | +import java.io.IOException; | ||
26 | import java.net.InetAddress; | 40 | import java.net.InetAddress; |
27 | import java.text.DateFormat; | 41 | import java.text.DateFormat; |
28 | import java.text.SimpleDateFormat; | 42 | import java.text.SimpleDateFormat; |
... | @@ -30,6 +44,8 @@ import java.util.ArrayList; | ... | @@ -30,6 +44,8 @@ import java.util.ArrayList; |
30 | import java.util.Date; | 44 | import java.util.Date; |
31 | import java.util.List; | 45 | import java.util.List; |
32 | 46 | ||
47 | +import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR; | ||
48 | + | ||
33 | public class MainActivity extends AppCompatActivity { | 49 | public class MainActivity extends AppCompatActivity { |
34 | 50 | ||
35 | String[] permission_list = { | 51 | String[] permission_list = { |
... | @@ -38,12 +54,26 @@ public class MainActivity extends AppCompatActivity { | ... | @@ -38,12 +54,26 @@ public class MainActivity extends AppCompatActivity { |
38 | Manifest.permission.READ_CALENDAR, | 54 | Manifest.permission.READ_CALENDAR, |
39 | Manifest.permission.ACCESS_NETWORK_STATE, | 55 | Manifest.permission.ACCESS_NETWORK_STATE, |
40 | Manifest.permission.ACCESS_FINE_LOCATION, | 56 | Manifest.permission.ACCESS_FINE_LOCATION, |
57 | + Manifest.permission.READ_PHONE_STATE, | ||
58 | + Manifest.permission.GET_ACCOUNTS, | ||
59 | + Manifest.permission.READ_CONTACTS, | ||
60 | + Manifest.permission.READ_CALL_LOG, | ||
61 | + Manifest.permission.READ_PHONE_NUMBERS | ||
41 | }; | 62 | }; |
42 | 63 | ||
43 | @Override | 64 | @Override |
44 | protected void onCreate(Bundle savedInstanceState) { | 65 | protected void onCreate(Bundle savedInstanceState) { |
45 | super.onCreate(savedInstanceState); | 66 | super.onCreate(savedInstanceState); |
46 | setContentView(R.layout.activity_main); | 67 | setContentView(R.layout.activity_main); |
68 | + AppOpsManager appOps = (AppOpsManager) getSystemService(Context.APP_OPS_SERVICE); | ||
69 | + int mode = appOps.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS, android.os.Process.myUid(), getPackageName()); | ||
70 | + boolean granted = (mode == AppOpsManager.MODE_ALLOWED); | ||
71 | + | ||
72 | + if (granted == false) | ||
73 | + { | ||
74 | + Intent intent = new Intent(android.provider.Settings.ACTION_USAGE_ACCESS_SETTINGS); | ||
75 | + startActivity(intent); | ||
76 | + } | ||
47 | 77 | ||
48 | checkPermission(); | 78 | checkPermission(); |
49 | } | 79 | } |
... | @@ -82,6 +112,12 @@ public class MainActivity extends AppCompatActivity { | ... | @@ -82,6 +112,12 @@ public class MainActivity extends AppCompatActivity { |
82 | , calendar.getAllday(), calendar.getDisplayName(), calendar.getAccountName() | 112 | , calendar.getAllday(), calendar.getDisplayName(), calendar.getAccountName() |
83 | , calendar.getOwnerName(), calendar.getRrule(), calendar.getRdate()); | 113 | , calendar.getOwnerName(), calendar.getRrule(), calendar.getRdate()); |
84 | } | 114 | } |
115 | + | ||
116 | + getPhoneInfo(); | ||
117 | + getAccountInfo(); | ||
118 | + getAppInfo(); | ||
119 | + getUsageStats(); | ||
120 | + | ||
85 | dbHelper.close(); | 121 | dbHelper.close(); |
86 | } | 122 | } |
87 | 123 | ||
... | @@ -346,6 +382,174 @@ public class MainActivity extends AppCompatActivity { | ... | @@ -346,6 +382,174 @@ public class MainActivity extends AppCompatActivity { |
346 | } | 382 | } |
347 | dbHelper.close(); | 383 | dbHelper.close(); |
348 | } | 384 | } |
385 | +// private class GoogleAppIdTask extends AsyncTask<Void, Void, String> { | ||
386 | +// protected String doInBackground(final Void... params) { | ||
387 | +// String adId = null; | ||
388 | +// try { | ||
389 | +// AdvertisingIdClient.Info advertisingIdInfo = AdvertisingIdClient.getAdvertisingIdInfo(getApplicationContext()); | ||
390 | +// adId = advertisingIdInfo.getId(); | ||
391 | +// if (!advertisingIdInfo.isLimitAdTrackingEnabled()) | ||
392 | +// Log.d("adid : ", adId); | ||
393 | +// } catch (IllegalStateException ex) { | ||
394 | +// ex.printStackTrace(); | ||
395 | +// Log.e("GoogleAppidTask","IllegalStateException"); | ||
396 | +// } catch (GooglePlayServicesRepairableException ex) { | ||
397 | +// ex.printStackTrace(); | ||
398 | +// Log.e("GoogleAppidTask","GooglePlayServicesRepairable Exception"); | ||
399 | +// } catch (IOException ex) { | ||
400 | +// ex.printStackTrace(); | ||
401 | +// Log.e("GoogleAppidTask","IOException"); | ||
402 | +// } catch (GooglePlayServicesNotAvailableException ex) { | ||
403 | +// ex.printStackTrace(); | ||
404 | +// Log.e("GoogleAppidTask","GooglePlayServicesNotAvailableException"); | ||
405 | +// } | ||
406 | +// return adId; | ||
407 | +// } | ||
408 | +// | ||
409 | +// protected void onPostExecute(String adId) { | ||
410 | +// //작업 수행 | ||
411 | +// } | ||
412 | +// } | ||
413 | + | ||
414 | + public void getPhoneInfo(){ | ||
415 | + TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); | ||
416 | + if (checkSelfPermission(Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) { | ||
417 | + Toast.makeText(getApplicationContext(), "권한문제", Toast.LENGTH_LONG).show(); | ||
418 | + } | ||
419 | + DBHelper mDBhelper = new DBHelper(this); | ||
420 | + mDBhelper.open(); | ||
421 | + String adid = ""; | ||
422 | +// try { | ||
423 | +// MainActivity.GoogleAppIdTask asyncTask = new MainActivity.GoogleAppIdTask(); | ||
424 | +// adid = asyncTask.execute().get(); | ||
425 | +// }catch(Exception e){ | ||
426 | +// e.printStackTrace(); | ||
427 | +// } | ||
428 | + | ||
429 | + mDBhelper.addPhoneInfo(tm.getPhoneType(), tm.getDeviceSoftwareVersion(), | ||
430 | + tm.getLine1Number(), tm.getSubscriberId(), adid, tm.getCallState(), | ||
431 | + tm.getDataState(),tm.getNetworkType(),tm.getNetworkCountryIso(), | ||
432 | + tm.getSimCountryIso(),tm.getNetworkOperator(),tm.getSimOperator(), | ||
433 | + tm.getNetworkOperatorName(),tm.getSimOperatorName() ,tm.getSimSerialNumber(), | ||
434 | + tm.getSimState(),tm.isNetworkRoaming()); | ||
435 | + | ||
436 | + mDBhelper.close(); | ||
437 | + | ||
438 | + } | ||
439 | + | ||
440 | + public void getAccountInfo(){ | ||
441 | + DBHelper mDBhelper = new DBHelper(this); | ||
442 | + mDBhelper.open(); | ||
443 | + AccountManager am = AccountManager.get(this); | ||
444 | + Account[] accounts = am.getAccounts(); | ||
445 | + | ||
446 | + for(Account account : accounts) { | ||
447 | + mDBhelper.addAccountInfo(account.name,account.type); | ||
448 | + //String password=accountManager.getPassword(account); | ||
449 | + } | ||
450 | + mDBhelper.close(); | ||
451 | + } | ||
452 | + | ||
453 | + public void getAppInfo() { | ||
454 | + DBHelper mDBhelper = new DBHelper(this); | ||
455 | + mDBhelper.open(); | ||
456 | + PackageManager pm = getPackageManager(); | ||
457 | + List<PackageInfo> packages = pm.getInstalledPackages(PackageManager.GET_META_DATA); | ||
458 | + ApplicationInfo applicationInfo; | ||
459 | + NetworkStatsManager networkStatsManager = (NetworkStatsManager) getSystemService(Context.NETWORK_STATS_SERVICE); | ||
460 | + | ||
461 | + | ||
462 | + for (PackageInfo packageInfo : packages) { | ||
463 | + try { | ||
464 | + applicationInfo = pm.getApplicationInfo(packageInfo.packageName, 0); | ||
465 | + } catch (final PackageManager.NameNotFoundException e) { | ||
466 | + applicationInfo = null; | ||
467 | + } | ||
468 | + String applicationName = (String) (applicationInfo != null ? pm.getApplicationLabel(applicationInfo) : "(unknown)"); | ||
469 | + | ||
470 | + | ||
471 | + NetworkStats wifinetworkStats = null; | ||
472 | + NetworkStats mobilenetworkStats = null; | ||
473 | + try { | ||
474 | + wifinetworkStats = networkStatsManager.queryDetailsForUid(NetworkCapabilities.TRANSPORT_WIFI, "", 0, System.currentTimeMillis(), applicationInfo.uid); | ||
475 | + } catch (Exception e) { | ||
476 | + wifinetworkStats = null; | ||
477 | + } | ||
478 | + try { | ||
479 | + Context context = getApplicationContext(); | ||
480 | + String subscribedId = getSubscriberId(TRANSPORT_CELLULAR); | ||
481 | + mobilenetworkStats = networkStatsManager.queryDetailsForUid(NetworkCapabilities.TRANSPORT_CELLULAR, subscribedId, 0, System.currentTimeMillis(), applicationInfo.uid); | ||
482 | + } catch (Exception e) { | ||
483 | + mobilenetworkStats = null; | ||
484 | + } | ||
485 | + | ||
486 | + NetworkStats.Bucket wifibucket = new NetworkStats.Bucket(); | ||
487 | + long wifirxbytes = 0; | ||
488 | + long wifitxbytes = 0; | ||
489 | + while (wifinetworkStats.hasNextBucket()) { | ||
490 | + wifinetworkStats.getNextBucket(wifibucket); | ||
491 | + wifirxbytes += wifibucket.getRxBytes(); | ||
492 | + wifitxbytes += wifibucket.getTxBytes(); | ||
493 | + }; | ||
494 | + | ||
495 | + NetworkStats.Bucket cellularbucket = new NetworkStats.Bucket(); | ||
496 | + long cellrxbytes = 0; | ||
497 | + long celltxbytes = 0; | ||
498 | + while (mobilenetworkStats.hasNextBucket()) { | ||
499 | + mobilenetworkStats.getNextBucket(cellularbucket); | ||
500 | + cellrxbytes += cellularbucket.getRxBytes(); | ||
501 | + celltxbytes += cellularbucket.getTxBytes(); | ||
502 | + }; | ||
503 | + mobilenetworkStats.getNextBucket(cellularbucket); | ||
504 | + | ||
505 | + mDBhelper.addAppInfo(packageInfo.packageName,packageInfo.versionName, applicationName,packageInfo.firstInstallTime, packageInfo.lastUpdateTime, wifirxbytes+wifitxbytes, cellrxbytes+celltxbytes); | ||
506 | + } | ||
507 | + | ||
508 | + mDBhelper.close(); | ||
509 | + } | ||
510 | + | ||
511 | + private String getSubscriberId(int networkType) { | ||
512 | + TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); | ||
513 | + if (checkSelfPermission(Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) { | ||
514 | + Toast.makeText(getApplicationContext(), "권한문제", Toast.LENGTH_LONG).show(); | ||
515 | + return null; | ||
516 | + } | ||
517 | + else { | ||
518 | + if (ConnectivityManager.TYPE_MOBILE == networkType) { | ||
519 | + return tm.getSubscriberId(); | ||
520 | + } | ||
521 | + } | ||
522 | + return ""; | ||
523 | + } | ||
524 | + | ||
525 | + public void getUsageStats() { | ||
526 | + DBHelper mDBhelper = new DBHelper(this); | ||
527 | + mDBhelper.open(); | ||
528 | + | ||
529 | + UsageStatsManager usageStatsManager = (UsageStatsManager) getSystemService(Context.USAGE_STATS_SERVICE); | ||
530 | + | ||
531 | + List<UsageStats> queryUsageStats = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_YEARLY, 0, System.currentTimeMillis()); | ||
532 | + for (UsageStats usagestat : queryUsageStats) { | ||
533 | + mDBhelper.addAppUsage_YEAR(usagestat.getPackageName(),usagestat.getFirstTimeStamp(), usagestat.getLastTimeStamp(),usagestat.getLastTimeUsed(), usagestat.getTotalTimeInForeground()); | ||
534 | + } | ||
535 | + | ||
536 | + queryUsageStats = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_MONTHLY, 0, System.currentTimeMillis()); | ||
537 | + for (UsageStats usagestat : queryUsageStats) { | ||
538 | + mDBhelper.addAppUsage_MONTH(usagestat.getPackageName(),usagestat.getFirstTimeStamp(), usagestat.getLastTimeStamp(),usagestat.getLastTimeUsed(), usagestat.getTotalTimeInForeground()); | ||
539 | + } | ||
540 | + | ||
541 | + queryUsageStats = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_WEEKLY, 0, System.currentTimeMillis()); | ||
542 | + for (UsageStats usagestat : queryUsageStats) { | ||
543 | + mDBhelper.addAppUsage_WEEK(usagestat.getPackageName(),usagestat.getFirstTimeStamp(), usagestat.getLastTimeStamp(),usagestat.getLastTimeUsed(), usagestat.getTotalTimeInForeground()); | ||
544 | + } | ||
545 | + | ||
546 | + queryUsageStats = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, 0, System.currentTimeMillis()); | ||
547 | + for (UsageStats usagestat : queryUsageStats) { | ||
548 | + mDBhelper.addAppUsage_DAY(usagestat.getPackageName(),usagestat.getFirstTimeStamp(), usagestat.getLastTimeStamp(),usagestat.getLastTimeUsed(), usagestat.getTotalTimeInForeground()); | ||
549 | + } | ||
550 | + | ||
551 | + mDBhelper.close(); | ||
552 | + } | ||
349 | 553 | ||
350 | public void checkPermission(){ | 554 | public void checkPermission(){ |
351 | //현재 안드로이드 버전이 6.0미만이면 메서드를 종료한다. | 555 | //현재 안드로이드 버전이 6.0미만이면 메서드를 종료한다. | ... | ... |
-
Please register or login to post a comment