You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 01:20:35