96SEO 2026-02-20 07:33 0
nstanceState);setContentView(R.layout.activity_main);if

{if(this.checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE)!
PackageManager.PERMISSION_GRANTED)
Toast.LENGTH_LONG).show();//申请权限的代码//
ActivityCompat.requestPermissions(this,
String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
REQUEST_CODE_TEST);requestPermissions(new
String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
REQUEST_CODE_TEST);}}}//回调方法Overridepublic
{super.onRequestPermissionsResult(requestCode,
grantResults);android.util.Log.e(test,
checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
这个方法是检测是否有具有READ_EXTERNAL_STORAGE
frameworks/base/core/java/android/content/ContextWrapper.java
mBase.checkSelfPermission(permission);}
2.frameworks/base/core/java/android/content/Context.java
PackageManager.PermissionResultpublic
frameworks/base/core/java/android/app/ContextImpl.java
IllegalArgumentException(permission
ActivityManagerService.java中的方法
PackageManager.PERMISSION_DENIED;}return
checkComponentPermission(permission,
checkComponentPermission(String
PackageManager.PERMISSION_GRANTED;}return
ActivityManager.checkComponentPermission(permission,
5.接着继续调用ActivityManager.java文件中的checkComponentPermission方法
checkComponentPermission(String
AppGlobals.getPackageManager().checkUidPermission(permission,
PackageManagerService.java中的checkUidPermission方法
checkPermissionDelegate;synchronized
checkUidPermissionImpl(permName,
mCheckPermissionDelegate;}return
checkPermissionDelegate.checkUidPermission(permName,
uid,PackageManagerService.this::checkUidPermissionImpl);}private
getPackagesForUid(uid);PackageParser.Package
mPackages.get(packageNames[i]);}return
mPermissionManager.checkUidPermission(permName,
PermissionManagerService.this.checkUidPermission(permName,
UserHandle.getUserId(callingUid);final
mPackageManagerInt.getInstantAppPackageName(callingUid)
mPackageManagerInt.getInstantAppPackageName(uid)
(!mUserManagerInt.exists(userId))
PackageManager.PERMISSION_DENIED;}if
PackageManager.PERMISSION_DENIED;}}
(mPackageManagerInt.filterAppAccess(pkg,
PackageManager.PERMISSION_DENIED;}final
pkg.mExtras).getPermissionsState();if
(permissionsState.hasPermission(permName,
(mSettings.isPermissionInstant(permName))
PackageManager.PERMISSION_GRANTED;}}
PackageManager.PERMISSION_GRANTED;}}if
(isImpliedPermissionGranted(permissionsState,
PackageManager.PERMISSION_GRANTED;}}
PackageManager.PERMISSION_GRANTED;}if
(FULLER_PERMISSION_MAP.containsKey(permName)
perms.contains(FULLER_PERMISSION_MAP.get(permName)))
PackageManager.PERMISSION_GRANTED;}}}return
PackageManager.PERMISSION_DENIED;}这里是最终判断返回值的方法,
动态申请权限不多,就是固定的几组(在上一篇文章中以介绍说明).
String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
跳转到Activity.java中的requestPermissions方法
frameworks/base/core/java/android/app/Activity.java
IllegalArgumentException(requestCode
(mHasCurrentPermissionsRequest)
cancellation.onRequestPermissionsResult(requestCode,
int[0]);return;}//创建跳转的目标activityIntent
getPackageManager().buildRequestPermissionsIntent(permissions);startActivityForResult(REQUEST_PERMISSIONS_WHO_PREFIX,
null);mHasCurrentPermissionsRequest
注意一下此段代码:buildRequestPermissionsIntent(permissions)
frameworks/base/core/java/android/content/pm/PackageManager.java
NonNullUnsupportedAppUsagepublic
buildRequestPermissionsIntent(NonNull
(ArrayUtils.isEmpty(permissions))
IllegalArgumentException(permission
Intent(ACTION_REQUEST_PERMISSIONS);intent.putExtra(EXTRA_REQUEST_PERMISSIONS_NAMES,
permissions);intent.setPackage(getPermissionControllerPackageName());return
android.content.pm.action.REQUEST_PERMISSIONS;
我们发现是GrantPermissionsActivity.java
android:namecom.android.packageinstaller.permission.ui.GrantPermissionsActivityandroid:configChangeskeyboardHidden|screenSizeandroid:excludeFromRecentstrueandroid:themestyle/GrantPermissionsandroid:visibleToInstantAppstrueandroid:inheritShowWhenLockedtrueintent-filter
android:nameandroid.content.pm.action.REQUEST_PERMISSIONS
android:nameandroid.intent.category.DEFAULT
在Android(10)版本上,是在packages/apps/PermissionController中,单独把这块拿出来了
对话框事件处理是在GrantPermissionsViewHandlerImpl.java中,
R.id.permission_allow_button:if
{view.performAccessibilityAction(AccessibilityNodeInfo.ACTION_CLEAR_ACCESSIBILITY_FOCUS,
null);mResultListener.onPermissionGrantResult(mGroupName,
R.id.permission_allow_always_button:if
{view.performAccessibilityAction(AccessibilityNodeInfo.ACTION_CLEAR_ACCESSIBILITY_FOCUS,
null);mResultListener.onPermissionGrantResult(mGroupName,
R.id.permission_allow_foreground_only_button:if
{view.performAccessibilityAction(AccessibilityNodeInfo.ACTION_CLEAR_ACCESSIBILITY_FOCUS,
null);mResultListener.onPermissionGrantResult(mGroupName,GRANTED_FOREGROUND_ONLY);}break;case
{view.performAccessibilityAction(AccessibilityNodeInfo.ACTION_CLEAR_ACCESSIBILITY_FOCUS,
null);mResultListener.onPermissionGrantResult(mGroupName,
R.id.permission_deny_and_dont_ask_again_button:if
{view.performAccessibilityAction(AccessibilityNodeInfo.ACTION_CLEAR_ACCESSIBILITY_FOCUS,
null);mResultListener.onPermissionGrantResult(mGroupName,DENIED_DO_NOT_ASK_AGAIN);}break;case
R.id.permission_more_info_button:Intent
Intent(Intent.ACTION_MANAGE_APP_PERMISSIONS);intent.putExtra(Intent.EXTRA_PACKAGE_NAME,
mAppPackageName);intent.putExtra(Intent.EXTRA_USER,
mUserHandle);intent.putExtra(ManagePermissionsActivity.EXTRA_ALL_PERMISSIONS,
true);mActivity.startActivity(intent);break;}}
有些用户觉得app要申请权限比较麻烦,就有定制软件默认就赋予某个应用运行时权限,不弹出对话框,我们看看怎么修改呢?
先来看frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java中的systemReady()方法
{mDefaultPermissionPolicy.grantDefaultPermissions(userId);}
跳转到DefaultPermissionGrantPolicy.java中
{grantPermissionsToSysComponentsAndPrivApps(userId);//默认赋予应用的运行时权限grantDefaultSystemHandlerPermissions(userId);grantDefaultPermissionExceptions(userId);synchronized
{mDefaultPermissionsGrantedUsers.put(userId,
grantDefaultSystemHandlerPermissions(int
providergrantSystemFixedPermissionsToSystemPackage(getDefaultProviderAuthorityPackage(downloads,
UIgrantSystemFixedPermissionsToSystemPackage(getDefaultSystemHandlerActivityPackage(DownloadManager.ACTION_VIEW_DOWNLOADS,
providergrantSystemFixedPermissionsToSystemPackage(getDefaultProviderAuthorityPackage(com.android.externalstorage.documents,
CertInstallergrantSystemFixedPermissionsToSystemPackage(getDefaultSystemHandlerActivityPackage(Credentials.INSTALL_ACTION,
getDefaultSystemHandlerActivityPackage(Intent.ACTION_DIAL,
userId);grantDefaultPermissionsToDefaultSystemDialerApp(dialerPackage,
{grantDefaultPermissionsToDefaultSystemDialerApp(dialerAppPackageName,
{grantDefaultPermissionsToDefaultSystemSimCallManager(simCallManagerPackageName,
{grantDefaultPermissionsToDefaultSystemUseOpenWifiApp(useOpenWifiPackageName,
添加代码,赋予应用默认的运行时权限,不弹出申请对话框.grantPermissionsToSystemPackage(com.android.mytestapp,
如果你想添加自己的应用默认赋予运行时权限的话,可以这样子修改,如下:
grantPermissionsToSystemPackage(com.android.mytestapp,
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback