下面列出了android.app.PendingIntent#getCreatorPackage ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
/**
* @see android.app.PendingIntent#getCreatorPackage()
*/
@SuppressWarnings("deprecation")
public static String getCreatorPackage(PendingIntent intent) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
return intent.getCreatorPackage();
} else {
return intent.getTargetPackage();
}
}
/**
* Verify the qualification of this API invocation, mainly the permission of API caller.
*
* @param pkg the package name of API caller, if known.
* @param uid the UID of API caller, not used if caller_pkg is null.
* @return null if verified, or error message for debugging purpose (NOT part of the API protocol).
*/
static String verifyCaller(final Context context, final Intent intent, @Nullable String pkg, int uid) {
if (pkg == null) {
final PendingIntent id = intent.getParcelableExtra(Api.latest.EXTRA_CALLER_ID);
if (id == null) return "Missing required PendingIntent extra: " + Api.latest.EXTRA_CALLER_ID;
pkg = id.getCreatorPackage();
uid = id.getCreatorUid();
if (pkg == null) return "No creator information in " + id;
}
if (Users.isSameApp(uid, Process.myUid())) return null; // From myself (possibly in other user).
// This log should generally be placed in the caller site, do it after same app check to skip this for internal API caller with component set.
if (intent.getPackage() == null && intent.getComponent() != null)
Log.w(TAG, "Never use implicit intent or explicit intent with component name for API request, use Intent.setPackage() instead.");
Log.d(TAG, "API invoked by " + pkg);
if (SDK_INT >= M) {
final int permission_result = context.checkPermission(Api.latest.PERMISSION_FREEZE_PACKAGE, 0, uid);
if (permission_result == PackageManager.PERMISSION_GRANTED) return null;
}
// Fallback verification for API v1 clients.
final Integer value = sVerifiedCallers.get(pkg);
if (value == null) return "Unauthorized client: " + pkg;
final int signature_hash = value;
if (signature_hash == 0) return null; // 0 means already verified (cached)
// Legacy verification is not supported inside Island without INTERACT_ACROSS_USERS on Android P+, due to MATCH_ANY_USER being restricted.
try { @SuppressWarnings("deprecation") @SuppressLint({"PackageManagerGetSignatures", "WrongConstant"})
final PackageInfo pkg_info = context.getPackageManager().getPackageInfo(pkg, GET_SIGNATURES
| (SDK_INT < P || Permissions.has(context, INTERACT_ACROSS_USERS) ? Hacks.MATCH_ANY_USER_AND_UNINSTALLED : GET_UNINSTALLED_PACKAGES));
return verifySignature(pkg, signature_hash, pkg_info);
} catch (final PackageManager.NameNotFoundException e) { return "Permission denied or client package not found: " + pkg; }
}
/**
* Get the package name of the creator application.
* <p>
* <strong> Note:</strong> This is self-reported and could be untrusted. Intent sender can
* modify it to return the package name from a different application.
*
* @param intent The {@link BrowserActionsIntent}.
* @return The creator package name.
*/
@SuppressWarnings("deprecation")
public static String getUntrustedCreatorPackageName(Intent intent) {
PendingIntent pendingIntent = intent.getParcelableExtra(BrowserActionsIntent.EXTRA_APP_ID);
if (pendingIntent != null) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
return pendingIntent.getCreatorPackage();
} else {
return pendingIntent.getTargetPackage();
}
}
return null;
}
protected void updatePackage() {
// This is an optional parameter obtained via Reflection, if possible.
// Useful for obtaining information such as the app's icon and using it in the volume_3 panel.
if (!IS_V18 || null == remoteMetadataProvider) return;
LOGI(TAG, "updatePackage()");
PendingIntent intent = remoteMetadataProvider.getCurrentClientPendingIntent();
if (null == intent) return;
playbackInfo.mRemotePackageName = intent.getCreatorPackage();
if (null != metadata)
metadata.setRemotePackage(playbackInfo.mRemotePackageName);
}
/**
* @see android.app.PendingIntent#getCreatorPackage()
*/
@SuppressWarnings("deprecation")
public static String getCreatorPackage(PendingIntent intent) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
return intent.getCreatorPackage();
} else {
return intent.getTargetPackage();
}
}
/**
* Get the package name of the creator application.
* @param intent The {@link BrowserActionsIntent}.
* @return The creator package name.
*/
@SuppressWarnings("deprecation")
public static String getCreatorPackageName(Intent intent) {
PendingIntent pendingIntent = intent.getParcelableExtra(BrowserActionsIntent.EXTRA_APP_ID);
if (pendingIntent != null) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
return pendingIntent.getCreatorPackage();
} else {
return pendingIntent.getTargetPackage();
}
}
return null;
}
protected void updatePackage() {
// This is an optional parameter obtained via Reflection, if possible.
// Useful for obtaining information such as the app's icon and using it in the volume_3 panel.
if (!IS_V18 || null == remoteMetadataProvider) return;
LOGI(TAG, "updatePackage()");
PendingIntent intent = remoteMetadataProvider.getCurrentClientPendingIntent();
if (null == intent) return;
playbackInfo.mRemotePackageName = intent.getCreatorPackage();
if (null != metadata)
metadata.setRemotePackage(playbackInfo.mRemotePackageName);
}
@SuppressWarnings("deprecation")
public static String packageFromPendingIntent(PendingIntent pi) {
if (pi == null) return null;
if (SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN_MR1) {
return pi.getTargetPackage();
} else {
return pi.getCreatorPackage();
}
}
private final BroadcastStats getStatsLocked(PendingIntent pi) {
String pkg = pi.getCreatorPackage();
int uid = pi.getCreatorUid();
return getStatsLocked(uid, pkg);
}
@Override
public void onReceive(Context context, Intent intent) {
//PPApplication.logE("##### NextAlarmClockBroadcastReceiver.onReceive", "xxx");
//CallsCounter.logCounter(context, "NextAlarmClockBroadcastReceiver.onReceive", "NextAlarmClockBroadcastReceiver_onReceive");
if (intent == null)
return;
//if (!PPApplication.getApplicationStarted(context.getApplicationContext(), true))
// return;
//if (android.os.Build.VERSION.SDK_INT >= 21) {
String action = intent.getAction();
if ((action != null) && action.equals(AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED)) {
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
if (alarmManager != null) {
AlarmManager.AlarmClockInfo alarmClockInfo = alarmManager.getNextAlarmClock();
if (alarmClockInfo != null) {
long _time = alarmClockInfo.getTriggerTime();
/*if (PPApplication.logEnabled()) {
SimpleDateFormat sdf = new SimpleDateFormat("EE d.MM.yyyy HH:mm:ss:S");
String result = sdf.format(_time);
PPApplication.logE("NextAlarmClockBroadcastReceiver.onReceive", "_time=" + result);
}*/
PendingIntent infoPendingIntent = alarmClockInfo.getShowIntent();
// infoPendingIntent == null - Xiaomi Clock :-/
// infoPendingIntent == null - LG Clock :-/
// infoPendingIntent == null - Huawei Clock :-/
if (infoPendingIntent != null) {
String packageName = infoPendingIntent.getCreatorPackage();
//PPApplication.logE("NextAlarmClockBroadcastReceiver.onReceive", "packageName=" + packageName);
if (packageName != null) {
if (!packageName.equals(context.getPackageName())) {
//PPApplication.logE("NextAlarmClockBroadcastReceiver.onReceive", "packageName=" + packageName);
// com.google.android.deskclock - Google Clock
// com.sec.android.app.clockpackage - Samsung Clock
// com.sonyericsson.organizer - Sony Clock
// com.amdroidalarmclock.amdroid - AMdroid
// com.alarmclock.xtreme.free - Alarm Clock XTreme free
// com.alarmclock.xtreme - Alarm Clock XTreme
// droom.sleepIfUCan - Alarmy (Sleep if u can)
// com.funanduseful.earlybirdalarm - Early Bird Alarm Clock
// com.apalon.alarmclock.smart - Good Morning Alarm Clock
// com.kog.alarmclock - I Can't Wake Up! Alarm Clock
// com.urbandroid.sleep - Sleep as Android
// ch.bitspin.timely - Timely
// com.angrydoughnuts.android.alarmclock - Alarm Klock
/*if (packageName.equals("com.google.android.deskclock") ||
packageName.equals("com.sec.android.app.clockpackage") ||
packageName.equals("com.sonyericsson.organizer") ||
packageName.equals("com.amdroidalarmclock.amdroid") ||
packageName.equals("com.alarmclock.xtreme") ||
packageName.equals("com.alarmclock.xtreme.free") ||
packageName.equals("droom.sleepIfUCan") ||
packageName.equals("com.funanduseful.earlybirdalarm") ||
packageName.equals("com.apalon.alarmclock.smart") ||
packageName.equals("com.kog.alarmclock") ||
packageName.equals("com.urbandroid.sleep") ||
packageName.equals("ch.bitspin.timely") ||
packageName.equals("com.angrydoughnuts.android.alarmclock"))*/
setAlarm(_time, packageName, alarmManager, context);
}
} /*else {
//PPApplication.logE("NextAlarmClockBroadcastReceiver.onReceive", "packageName == null");
setAlarm(_time, "", alarmManager, context);
}*/
} /*else {
//PPApplication.logE("NextAlarmClockBroadcastReceiver.onReceive", "infoPendingIntent == null");
setAlarm(_time, "", alarmManager, context);
}*/
}
//else {
//PPApplication.logE("NextAlarmClockBroadcastReceiver.onReceive", "alarmClockInfo == null");
//removeAlarm(alarmManager, context);
//}
}
}
//}
}