Android 钉钉第三方登录问题

本文详细介绍了如何在Android应用中集成钉钉第三方登录,包括注册应用获取AppId和AppKey,注入依赖,创建DDShareActivity,处理授权回调,以及解决在Android 11上可能出现的问题。主要涉及Android开发和钉钉SDK的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用钉钉第三方登录

第一步 去钉钉开发者平台注册App

钉钉开发者平台地址
在这里插入图片描述
注册自己的应用
*获取到自己的AppId 和 AppKey

钉钉开发者文档

在这里插入图片描述

实现步骤

1、注入依赖


	 implementation 'com.aliyun.ams:alicloud-android-push:3.2.+'

2、在您的包名相应目录下新建一个ddshare。


需要注意的是名字一定要相同

然后在AndroidManifest文件中添加exported属性,设置为true。

<activity
            android:exported="true"
            android:theme="@android:style/Theme.Translucent.NoTitleBar"
            android:launchMode="singleInstance"
            android:name="xxx.xxxx.xxxx.ddshare.DDShareActivity">
</activity>
换成你自己的路径名字

/**
*  注意   BToast.showText(); 是我自己封装的Toast
* 	      Logger也是一个封装   可以改成Log
*
*/

public class DDShareActivity extends Activity implements IDDAPIEventHandler {

    private IDDShareApi mIDDShareApi;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d("lzc", "onCreate==========>");
        EventBusManager.getInstance().register(this);
        try {
            //activity的export为true,try起来,防止第三方拒绝服务攻击
            mIDDShareApi = DDShareApiFactory.createDDShareApi(this,
                   "放入你的AppId",
                    true);
            mIDDShareApi.handleIntent(getIntent(), this);

//            sendAuth();
        } catch (Exception e) {
            e.printStackTrace();
            Log.d("lzc", "错误信息===========>" + e.toString());
        }
    }

    @Override
    public void onReq(BaseReq baseReq) {
        Log.d("lzc", "onReq=============>");
    }

    @Override
    public void onResp(BaseResp baseResp) {
        int errCode = baseResp.mErrCode;
        Log.d("lzc", "errorCode==========>" + errCode);
        String errMsg = baseResp.mErrStr;
        Log.d("lzc", "errMsg==========>" + errMsg);

        if (baseResp.getType() == ShareConstant.COMMAND_SENDAUTH_V2 && (baseResp instanceof SendAuth.Resp)) {
            SendAuth.Resp authResp = (SendAuth.Resp) baseResp;
            switch (errCode) {
                case BaseResp.ErrCode.ERR_OK:
                   Logger.d( "授权成功");
                  	//authResp.code就是返回的授权码
                  	//传回到你自己的页面
                    break;
                case BaseResp.ErrCode.ERR_USER_CANCEL:
                    BToast.showText(this, "授权取消");
                    break;
                default:
                        BToast.showText(this, "登录失败" + baseResp.mErrStr);
                    break;
            }
        } else {
            switch (errCode) {
                case BaseResp.ErrCode.ERR_OK:
                    BToast.showText(this, "分享成功");
                    break;
                case BaseResp.ErrCode.ERR_USER_CANCEL:
                    BToast.showText(this, "分享取消");
                    break;
                default:
                        BToast.showText(this, "分享失败" + baseResp.mErrStr);
                    break;
            }
        }

        finish();
    }
}

3、调起钉钉登录的方式


    IDDShareApi    iddShareApi = DDShareApiFactory.createDDShareApi(LoginActivity.this, appKey, true);
    if (!isInstalled) {
            showToast("请安装钉钉");
            return;
        }
        SendAuth.Req req = new SendAuth.Req();
        boolean isSupport = req.getSupportVersion() <= iddShareApi.getDDSupportAPI();
        if (!isSupport) {
            showToast("不支持登录授权");
            return;
        }
        req.scope = SendAuth.Req.SNS_LOGIN;
        if (req.getSupportVersion() > iddShareApi.getDDSupportAPI()) {
            showToast("钉钉版本过低,不支持登录授权");
            return;
        }
        iddShareApi.sendReq(req);
		

到这里也就是可以跑起来了

4、遇到的问题


	1、在Android 11版本的手机中明明安装了钉钉
		但是会弹出“请安装钉钉的问题”
		
		出现的原因:Android11 要检查下包的可见性
		解决方法:<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/>
		缺点:可能上架会卡审核
	
	2、当跳转到钉钉授权的页面时,钉钉授权页面是空白的,弹出一个“出错了请重试”
		出现的原因:因为包名或者签名不对
		解决方法:查看安装的签名和包名是否和钉钉开发者平台的是否相同
		
钉钉的CalDAV服务器是一个标准的CalDAV服务器,因此你可以使用任何支持CalDAV协议的第三方库来访问它。下面是一个使用Android系统自带的SyncAdapter框架实现的CalDAV同步Demo。 1. 添加依赖 在build.gradle文件中添加以下依赖: ``` dependencies { implementation "com.github.aflx:sardine-android:5.7.0" } ``` 这里使用了Sardine-Android库,它是一个支持WebDAV和CalDAV协议的Android库,可以方便地与钉钉的CalDAV服务器进行交互。 2. 创建SyncAdapter 创建一个继承自AbstractThreadedSyncAdapter的SyncAdapter类,并实现其中的onPerformSync()方法,用于执行CalDAV同步任务。 ```java public class CalDAVSyncAdapter extends AbstractThreadedSyncAdapter { private static final String TAG = "CalDAVSyncAdapter"; private final Sardine mSardine; public CalDAVSyncAdapter(Context context, boolean autoInitialize) { super(context, autoInitialize); mSardine = new OkHttpSardine(); } @Override public void onPerformSync(Account account, Bundle extras, String authority, ContentProviderClient provider, SyncResult syncResult) { try { // TODO: 执行CalDAV同步任务 } catch (Exception e) { Log.e(TAG, "CalDAV sync failed", e); syncResult.stats.numIoExceptions++; } } } ``` 3. 注册SyncAdapter 在AndroidManifest.xml文件中注册SyncAdapter,并指定对应的账户类型和CalDAV服务器地址。 ```xml <application> <provider android:name="android.content.ContentProvider" android:authorities="com.android.calendar" android:exported="false" android:syncable="true" /> <service android:name=".CalDAVSyncAdapterService" android:exported="true"> <intent-filter> <action android:name="android.content.SyncAdapter" /> </intent-filter> <meta-data android:name="android.content.SyncAdapter" android:resource="@xml/caldav_sync_adapter" /> <meta-data android:name="android.provider.CONTACTS_STRUCTURE" android:resource="@xml/contacts" /> </service> </application> <uses-permission android:name="android.permission.READ_CALENDAR" /> <uses-permission android:name="android.permission.WRITE_CALENDAR" /> <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" /> <account-authenticator xmlns:android="http://schemas.android.com/apk/res/android" android:accountType="com.android.exchange" android:icon="@drawable/icon_exchange" android:smallIcon="@drawable/icon_exchange" android:label="@string/app_name" /> <sync-adapter xmlns:android="http://schemas.android.com/apk/res/android" android:contentAuthority="com.android.calendar" android:accountType="com.android.exchange" android:userVisible="false" android:supportsUploading="true" android:allowParallelSyncs="false" android:isAlwaysSyncable="true" /> ``` 在res/xml目录下创建caldav_sync_adapter.xml文件,指定SyncAdapter的参数。 ```xml <sync-adapter xmlns:android="http://schemas.android.com/apk/res/android" android:contentAuthority="com.android.calendar" android:accountType="com.android.exchange" android:userVisible="false" android:supportsUploading="true" android:allowParallelSyncs="false" android:isAlwaysSyncable="true" /> ``` 4. 执行CalDAV同步任务 在SyncAdapter的onPerformSync()方法中,使用Sardine库实现CalDAV同步任务。以下是一个简单的例子,可以获取钉钉CalDAV服务器上的所有日历事件。 ```java @Override public void onPerformSync(Account account, Bundle extras, String authority, ContentProviderClient provider, SyncResult syncResult) { try { // 创建Sardine对象 mSardine.setCredentials("username", "password"); // 获取所有日历事件 List<DavResource> resources = mSardine.getResources("https://calendar.dingtalk.com/caldav/username/events/"); // 解析日历事件 for (DavResource resource : resources) { CalendarBuilder builder = new CalendarBuilder(); Calendar calendar = builder.build(resource.getInputStream()); Log.d(TAG, "Event: " + calendar.toString()); } } catch (Exception e) { Log.e(TAG, "CalDAV sync failed", e); syncResult.stats.numIoExceptions++; } } ``` 注意:在使用Sardine库访问CalDAV服务器时,需要使用完整的CalDAV资源地址,例如"https://calendar.dingtalk.com/caldav/username/events/",其中username为钉钉账号的用户名。另外,钉钉的CalDAV服务器使用的是HTTPS协议,需要添加相应的证书验证。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值