Android Java跨应用共享用户数据:实现跨应用用户名显示
Android跨应用共享登录用户信息(Java实现)
方案一:ContentProvider(官方推荐,安全可控)
这是Android官方提供的跨应用数据共享标准方案,能精准控制数据访问权限。
步骤1:在第一个应用(数据提供方)配置
1.1 定义自定义访问权限
在AndroidManifest.xml中添加自定义权限,限制只有授权应用能访问:
<permission android:name="com.yourfirstapp.PROVIDER_ACCESS" android:protectionLevel="signature" /> <!-- 仅同签名应用可访问,更安全 -->
1.2 实现ContentProvider子类
创建UserInfoProvider.java,读取自身SharedPreferences中的登录信息并对外提供查询接口:
public class UserInfoProvider extends ContentProvider { public static final String AUTHORITY = "com.yourfirstapp.userprovider"; public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/user"); private SharedPreferences loginSp; @Override public boolean onCreate() { loginSp = getContext().getSharedPreferences("login_info", Context.MODE_PRIVATE); return true; } @Nullable @Override public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) { // 创建Cursor返回用户名数据 MatrixCursor cursor = new MatrixCursor(new String[]{"username"}); String username = loginSp.getString("logged_username", null); if (username != null) { cursor.addRow(new Object[]{username}); } return cursor; } // 其他未用到的方法(insert/update/delete/getType)返回默认值即可 @Nullable @Override public String getType(@NonNull Uri uri) { return null; } @Nullable @Override public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) { return null; } @Override public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) { return 0; } @Override public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) { return 0; } }
1.3 注册ContentProvider
在第一个应用的AndroidManifest.xml中注册Provider,绑定权限:
<provider android:name=".UserInfoProvider" android:authorities="com.yourfirstapp.userprovider" android:exported="true" android:permission="com.yourfirstapp.PROVIDER_ACCESS" />
步骤2:在第二个应用(数据调用方)访问
2.1 声明权限
在第二个应用的AndroidManifest.xml中添加权限申请:
<uses-permission android:name="com.yourfirstapp.PROVIDER_ACCESS" />
2.2 查询用户信息
在需要展示的Activity中,通过ContentResolver查询数据:
public class MainActivity extends AppCompatActivity { private TextView tvUserInfo; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tvUserInfo = findViewById(R.id.tv_user_info); queryFirstAppUserInfo(); } private void queryFirstAppUserInfo() { try { // 调用第一个应用的ContentProvider Cursor cursor = getContentResolver().query( Uri.parse("content://com.yourfirstapp.userprovider/user"), new String[]{"username"}, null, null, null ); if (cursor != null) { if (cursor.moveToFirst()) { String username = cursor.getString(cursor.getColumnIndex("username")); tvUserInfo.setText("当前登录用户:" + username); } else { tvUserInfo.setText("请先登录第一个应用"); } cursor.close(); } else { tvUserInfo.setText("无法获取登录状态"); } } catch (SecurityException e) { tvUserInfo.setText("无权限访问登录信息"); } catch (Exception e) { tvUserInfo.setText("第一个应用未安装"); } } }
方案二:共享UserId(适合同开发者、同签名应用)
如果两个应用属于同一开发者且使用相同签名打包,可通过共享UserId直接访问对方的SharedPreferences:
步骤1:配置共享UserId
在两个应用的AndroidManifest.xml的<application>标签中添加:
android:sharedUserId="com.yourcompany.shared_account"
步骤2:第二个应用读取第一个应用的SharedPreferences
private void getFirstAppUserInfo() { try { // 获取第一个应用的Context Context firstAppContext = createPackageContext( "com.yourfirstapp", Context.CONTEXT_IGNORE_SECURITY ); SharedPreferences loginSp = firstAppContext.getSharedPreferences("login_info", Context.MODE_PRIVATE); String username = loginSp.getString("logged_username", null); if (username != null) { tvUserInfo.setText("当前登录用户:" + username); } else { tvUserInfo.setText("请先登录第一个应用"); } } catch (PackageManager.NameNotFoundException e) { tvUserInfo.setText("第一个应用未安装"); } catch (SecurityException e) { tvUserInfo.setText("无权限访问"); } }
注意事项
- 安全优先级:优先使用ContentProvider方案,通过签名权限严格控制访问范围;共享UserId会让两个应用共享权限,风险较高,仅适合信任的同开发者应用。
- 异常处理:必须捕获
PackageManager.NameNotFoundException(处理应用未安装)和SecurityException(处理权限不足)。 - 签名要求:使用签名级权限或共享UserId时,两个应用必须使用同一签名文件打包。
内容的提问来源于stack exchange,提问作者Darshan Beladiya
相关产品推荐
相关产品推荐

