3.7发布了,在AndroidStudio中怎么请使用5173账号发布

如何用 Android Studio 导入开源项目以及常见错误的解决办法
时间: 00:52:06
&&&& 阅读:22230
&&&& 评论:
&&&& 收藏:0
标签:声明:这篇文章完全,感谢大神的相助。这篇文章纯粹是为了备份。
本篇以Github上最热门的MaterialDesign库,来介绍怎样使用Android Sudio导入开源项目的,如果你和我一样刚刚从Eclipse转到AS,那本篇文章非常适合你。
如果不引入任何第三方库,不做自动化分渠道打包等操作,那可以在完全不了解Gradle的情况下进行Android项目的开发。但如果要想导入Github上的热门项目,必须首先熟悉Gradle。
Gradle是以Groovy为基础,面向java应用,基于DSL语法的自动化构建工具。是google引入,替换ant和maven的新工具,其依赖兼容maven和ivy。
简单来说,Gradle就是Andriod Studio引入的一种自动构建工程的工具,很好的解决了Android项目的构建。大概能解决以下开发过程中的痛点:
不用把第三方库下载下来。以前用Eclipse必须得把第三方库下载下来,然后在自己的项目中引入那个第三方library才行。但使用Gradle,几行代码就搞定第三方库的依赖,降低了耦合性。
不用手动修改N次代码,把代码打N个包发到N个市场。以前可能需要针对不同的渠道发不同的APK文件包,现在只需要在gradle中的几行代码就能一次生成多个渠道包。具体可参考此文章:。
如果你用AS新建一个项目,那此项目的默认项目结构如图所示,图中打开的文件是TestMe/build.gradle,已经给出了每句话的含义。
图中新建项目名为TestMe,使用了Project的目录结构。此目录下可见以下几个gradle文件,分别是:
TestMe/build.gradle,全局gradle,在这个文件里的设置会在整个项目里通用。
TestMe/app/build.gradle,模块的gradle,仅在app模块通用。
TestMe/settings.gradle,用于指定哪个目录是模块model。里面的内容默认是include ‘:app‘,表示app这个文件夹是一个模块。
而TestMe/app/build.gradle文件内容如图所示,具体解释参见图中注释。
2. 导入MaterialDesignLibrary项目
我们的目标是把MaterialDesignLibrary项目在AS里面成功运行,并在手机上运行成功。
2.1 第一步
首先,用git的clone命令将下载到本地。
2.2 第二步
进入AS,File-&Import Project,然后找到MaterialDesignLibrary目录,双击该目录下的build.gradle即可导入项目。
2.3 第三步
可以看导入好的Github上的MaterialDesignLibrary项目包含两个module,包括MaterialDesignDemo和一个MaterialDesign。
MaterialDesign的build.gradle文件第一行为:apply plugin: ‘com.android.library‘,表示这是一个Library。
MaterialDesignDemo的build.gradle文件第一行为:apply plugin: ‘com.android.application‘,表示这是一个应用。
他的这个项目使用的是引用本地已有的MaterialDesign库,而本文第三部分要讲的是引用网上中心库的MaterialDesign库。两种方法都可以,但后一种更加方便更常用,第一种方法不太常用。 第二步之后,可能会出现很多错,通常是因为配置问题,这部分详见本文下面的常见错误。&注意:一定要确保根目录下的setting.gradle里面是include ‘:MaterialDesign‘, ‘:MaterialDesignDemo‘。表示以上两个文件夹都是module。
3. 在自己的项目中引用MaterialDesignLibrary
还是之前的TestMe项目,只需要在TestMe/app/build.gradle中的dependencies中加入compile ‘com.github.navasmdc:MaterialDesign:即可,如下:
dependencies {
// 编译libs目录下的所有jar包
compile fileTree(dir: ‘libs‘, include: [‘*.jar‘]) //多个文件
//compile files(‘libs/foo.jar‘)
//单个文件这样写
compile ‘com.android.support:appcompat-v7:22.0.0‘ //编译第三方库
compile ‘com.github.navasmdc:MaterialDesign:
4. 常见错误
AS在导入开源的项目或者第三方库的时候经常会出现的错误如下。其实很多都是各种工具的版本问题。
Error:failed to find Build Tools revision 21.1.1&
是因为该开源库对应的Build Tools的版本你的AS里面没有。解决方法是点击他的链接进行下载。或者更改每个model里面的build.gradle文件中的buildToolsVersion "21.1.1"为本机里面有的Build Tolls版本。
Error:failed to find target android-18 : /Users/xujin/develop/adt-bundle-mac-x86_64-/sdk
是因为该开源库对应的android sdk的版本你的机器里面没有。解决方法同上,要么下载,要么改改配置。更改每个model里面的build.gradle文件中的compileSdkVersion 21为本机里面有的sdk版本。
Error:(44, 30) 错误: -source 1.6 中不支持 diamond 运算符 (请使用 -source 7 或更高版本以启用 diamond 运算符)
出错的原因是因为代码中有&List&Car& cars = new ArrayList&&();,java在1.7引入了钻石运算符&&,解决办法有两种。一是更改编译的java sdk版本,而是将出错代码改为List&Car& cars = new ArrayList&Car&();
Error:(37) No resource identifier found for attribute &checked& in package &com.gc.materialdesign&
是因为第37行的materialdesign:checked="true",命名空间materialdesign里面没有checked属性,改成check即可,代码如下。(之前遇到过,姑且说说。)
&com.gc.materialdesign.views.CheckBox
android:id="@+id/checkBox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:background="#1E88E5"
materialdesign:check="true"
参考资料标签:
&&国之画&&&& &&&&chrome插件
版权所有 京ICP备号-2
迷上了代码!Android开发(10)
GreenDao3.2在AndroidStudio中的配置和初步使用
1 配置project中的gradle
apply from: "config.gradle"
buildscript {
repositories {
maven{ url '/nexus/content/groups/public/'}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.2'
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2'
2 配置app中gradle
apply plugin: 'com.android.application'
apply plugin: 'me.tatarka.retrolambda'
apply plugin: 'org.greenrobot.greendao'
compileSdkVersion rootProject.ext.android["compileSdkVersion"]
buildToolsVersion rootProject.ext.android["buildToolsVersion"]
useLibrary 'org.apache.http.legacy'
compileOptions {
targetCompatibility JavaVersion.VERSION_1_8
sourceCompatibility JavaVersion.VERSION_1_8
defaultConfig {
applicationId "com.giant.knowledgebase"
minSdkVersion rootProject.ext.android["minSdkVersion"]
targetSdkVersion rootProject.ext.android["targetSdkVersion"]
versionCode rootProject.ext.android["versionCode"]
versionName rootProject.ext.android["versionName"]
testInstrumentationRunner rootProject.ext.dependencies["androidJUnitRunner"]
buildTypes {
buildConfigField "boolean", "LOG_DEBUG", "true"
buildConfigField "boolean", "USE_CANARY", "true"
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
buildConfigField "boolean", "LOG_DEBUG", "false"
buildConfigField "boolean", "USE_CANARY", "false"
minifyEnabled true
shrinkResources true
zipAlignEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfigs {
storeFile file('debug.keystore')
storePassword "android"
keyAlias "androiddebugkey"
keyPassword "android"
greendao {
schemaVersion 1
daoPackage 'com.your.pakagename.db.gen'
targetGenDir 'src/main/java'
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'org.greenrobot:greendao:3.2.2'
3.创建bean对象(不可以是内部类)
public class Shop{
public static final int TYPE_CART = 0x01;
public static final int TYPE_LOVE = 0x02;
@Id(autoincrement = true)
@Property(nameInDb = "price")
private int sell_
private String image_
private int
这里对Bean对象的注释进行解释
1. @Entity:告诉GreenDao该对象为实体,只有被@Entity注释的Bean类才能被dao类操作
2. @Id:对象的Id,使用Long类型作为EntityId,否则会报错。(autoincrement = true)表示主键会自增,如果false就会使用旧值
3. @Property:可以自定义字段名,注意外键不能使用该属性
4. @NotNull:属性不能为空
5. @Transient:使用该注释的属性不会被存入数据库的字段中
6. @Unique:该属性值必须在数据库中是唯一值
7. @Generated:编译后自动生成的构造函数、方法等的注释,提示构造函数、方法等不能被修改
4.点击make project后自动生成DaoMaster、DaoSession、DAOS类
这里对几个类进行解释
1. DevOpenHelper:创建SQLite数据库的SQLiteOpenHelper的具体实现
2. DaoMaster:GreenDao的顶级对象,作为数据库对象、用于创建表和删除表
3. DaoSession:管理所有的Dao对象,Dao对象中存在着增删改查等API
由于我们已经创建好了DaoSession和Shop的Bean对象,编译后会自动生成我们的ShopDao对象,可通过DaoSession获得
ShopDao dao = daoSession.getShopDao();
这里的Dao(Data Access Object)是指数据访问接口,即提供了数据库操作一些API接口,可通过dao进行增删改查操作
5.添加greendao管理类
package com.giant.knowledgebase.mvp.model.
import android.content.C
import android.database.sqlite.SQLiteD
import com.giant.knowledgebase.app.GlobalC
import com.giant.knowledgebase.mvp.model.db.gen.DaoM
import com.giant.knowledgebase.mvp.model.db.gen.DaoS
* Created by Jorble on .
public class GreenDaoManager {
private static DaoSession daoS
* 配置数据库
public static void setupDatabase(Context context,String dbName) {
DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(context, dbName, null);
SQLiteDatabase db = helper.getWritableDatabase();
DaoMaster daoMaster = new DaoMaster(db);
daoSession = daoMaster.newSession();
public static DaoSession getDaoInstant() {
return daoS
6.在application中oncreat方法中初始化GreenDaoManager
GreenDaoManager.setupDatabase(context,"knowledgebase.db");
7.在程序中直接调用GreenDao
GreenDaoManager.getDaoInstant().getNewsBeanDao().insert(news)
其他API的介绍
● 增加单个数据
○ getShopDao().insert(shop);
○ getShopDao().insertOrReplace(shop);
● 增加多个数据
○ getShopDao().insertInTx(shopList);
○ getShopDao().insertOrReplaceInTx(shopList);
● 查询全部
○ List& Shop& list = getShopDao().loadAll();
○ List& Shop& list = getShopDao().queryBuilder().list();
● 查询附加单个条件
○ .where()
○ .whereOr()
● 查询附加多个条件
○ .where(, , ,)
○ .whereOr(, , ,)
● 查询附加排序
○ .orderDesc()
○ .orderAsc()
● 查询限制当页个数
○ .limit()
● 查询总个数
○ .count()
● 修改单个数据
○ getShopDao().update(shop);
● 修改多个数据
○ getShopDao().updateInTx(shopList);
● 删除单个数据
○ getTABUserDao().delete(user);
● 删除多个数据
○ getUserDao().deleteInTx(userList);
● 删除数据ByKey
○ getTABUserDao().deleteByKey();
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:28771次
排名:千里之外
原创:14篇
转载:11篇
(1)(1)(8)(1)(2)(2)(10)欢迎转载,但请保留文章原始出处&_&&
生命壹号:
文章来源:
如今的app当中,几乎都包含了社会化分享的功能,来两张图see 一 see:
好在这种分享功能已经有第三方平台帮我们做好了,我们直接调用其SDK即可。市面上做社会化分享平台的比较好平台的有:mob等。
今天我们就用mob的平台做分享吧,官网地址是:
怎么样?光看这个网站的首页就碉堡了吧?好了不废话,进入正题。
开发环境:
IDE版本:Android Studio 1.2
物理机版本:Win7旗舰版(64位)
一、获取SDK并解压:
打开网站首页后,上图中的箭头处正是我们所需要的shareSDK。那我们就先将SDK下载下来吧。
上图中,点击箭头处,进行下载。
上图中的箭头处所示,我们需要的是Android的SDK,所以将其下载下来。
上图中,单机箭头处正式下载,弹出如下界面:
上图中,选择我们所需要的社交平台进行下载吧,这里面,我选择:新浪微博、微信、QQ、QQ空间。
下载完了之后,解压,就是下面这个样子:
ShareSDK在&ShareSDK for Android&目录下,此目录中的&Libs&包含了&MainLibs&文件夹(核心库)和&OnekeyShare&文件夹(快捷分享库)。截图如下:
&ShareSDK for Android Services&包含ShareSDK已经发布的&插件服务&,暂时只提供了&评论与赞&服务,我们不需要这个哈。
二、在ShareSDK官网进行注册:
在官网注册账号获得ShareSDK的Appkey:
然后选择应用名称和平台:
应用创建成功后,效果如下:
上图中的App Key要记住,因为我们稍后要用。
单击红框部分的&应用信息&,可以添加一些信息,这些信息可有可无哈。
二、在各大社交平台注册:
如果你想分享到新浪微博,就必须在新浪开放平台上将这个app注册一下,不然新浪是不会无缘无故让你分享的;分享到微信和QQ的道理是一样的。
参考链接:
ShareSDK各社交平台申请APPkey 的网址及申请流程汇总:
1、新浪开放平台注册:
参考链接:
登陆微博开放平台:
图文操作如下:
上图中,填好应用名称,选好&应用平台&(当然也可以同时勾选"iPhone",这样的话,android平台和ios平台就可以共用同一个appId了),然后单击&创建&即可。
上图中,单击左侧的&基本信息&,可以看到新浪微博的App Key、App Secret(红框部分),这个信息稍后需要填到我们工程中的ShareSDK.xml中对应的&SinaWeibo&标签中去。
上图中,单击左侧的&高级信息&,然后填写红框部分的网址,填的这个网址稍后需要填到我们工程中的ShareSDK.xml中对应的&SinaWeibo&标签的RedirectUrl属性中去。
上图的网址中,需要填写一个可以打开的网址即可,比如这个:
,不然分享的时候很可能会报下面的错误:
这个错误可以参考下面这个链接:
  新浪微博error:redirect_uri_mismatch的解决方法:
至于微信开放平台、QQ空间开放品台的申请是类似的,只不过微信开放平台的审核是需要时间的。
另外需要说明的是:
  在新浪微博和QQ的开放平台注册的应用,即使审核不通过,也可以得到AppKey进行分享;而微信开放平台申请的应用需要审核成功之后才能得到AppKey进行分享(我自己是等了一天的时间才得到了app审核通过的通知)
2、微信开放平台注册:
我们需要在微信开放平台进行注册:
参考链接:
  微信开放平台申请流程:
核心是要填&应用签名&,也就是下面这张图:(签名工具的apk安装包见附件)
3、腾讯开放平台的注册:
参考链接:
  腾讯开放平台申请流程:
申请网址:
四、各种配置:
1、导入SDK到工程文件:
打开Android Studio,先新建一个名为ShareDemo的project,然后开始导入sdk。
这里面我们就不用复制jar包的方式了,因为jar包不方便改源码。我们采用新建Library module的方式来导入SDK。当然了,如果你非要用复制jar包的方式来做,可以参考官方链接:
还记得新建Library module以及引用library的步骤吗?不清楚的话,可以去参考本人之前的:这里重复一下,新建一个module形式的第三方library的通用步骤是:
新建一个library形式的module,删掉这个module中src/main目录里面的所有文件(包括删掉java、res、AndroidManifest.xml)
复制第三方库的AndroidMainfest.xml、res、src文件(夹)到库目录的src/main目录中
将src/main目录下的src目录重命名(Shift+F6)为java
我们将上图中的两个工程文件新建为两个Library module:ShareSDK和OneKeyShare,记得要将下面的这个文件夹中的东西也要拷到MainLibs这个module的libs文件夹下:
然后,需要注意的是,OneKeyShare这个module是依赖于ShareSDK这个module;而app这个module是依赖于OneKeyShare这个module。
2、添加应用信息:
先在app这个module(即我们这个项目的module)下新建一个assets文件夹(即第三方资产目录),操作如下:
然后,我们将上图中的ShareSDK.xml文件复制到assets目录下。
紧接着开始修改ShareSDK.xml文件中的代码。这里以新浪微博为例:
AppKey = "修改成你在sharesdk后台注册的应用的appkey"/&
&!-- ShareByAppClient标识是否使用微博客户端分享,默认是false --&
&SinaWeibo
(自定义字段,整型,用于您项目中对此平台的识别符)
SortId="1"
(此平台在您分享列表中的位置,整型,数值越大越靠后)
(填写您在新浪微博上注册到的AppKey)
AppSecret="38a4ff9f0daaf31e02e3"
(填写您在新浪微博上注册到的AppSecret)
RedirectUrl=""
(填写您在新浪微博上注册的RedirectUrl)
ShareByAppClient="false"
(是否使用客户端进行分享)
Enable="true" /&
(布尔值,标记此平台是否有效)
代码解释:
&&& 02行:还记得之前说过AppKey有用吗?这里就派上用场了,填上去就行了。
&&& 08行:需要先事先在新浪微博的开发者平台注册得到AppKey。也就是上面第三段中提到的内容。
&&& 12行:如果不想用这个分享平台,可以将其设置为false。
ShareSDK的每一个平台都具备SortId、Id、Enable字段,除此之外的字段(如新浪微博的AppKey、AppSecret、RedirectUrl、ShareByAppClient等字段)需要到目标平台上注册应用以后得到,请正确填写这些字段的数据,否则ShareSDK无法完成授权,则后续的其它操作也将无法执行。
3、配置AndroidManifest.xml:
(1)添加如下权限:(和application节点并列)
&uses-permission android:name="android.permission.GET_TASKS"/&
&uses-permission android:name="android.permission.INTERNET"/&
&uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/&
&uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/&
&uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/&
&uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/&
&uses-permission android:name="android.permission.READ_PHONE_STATE"/&
&uses-permission android:name="android.permission.MANAGE_ACCOUNTS"/&
&uses-permission android:name="android.permission.GET_ACCOUNTS"/&
(2)在application节点下注册下面的Activity:
android:name="com.mob.tools.MobUIShell"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:configChanges="keyboardHidden|orientation|screenSize"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateHidden|adjustResize" &
&intent-filter&
&data android:scheme="tencent" /&
&action android:name="android.intent.action.VIEW" /&
&category android:name="android.intent.category.BROWSABLE" /&
&category android:name="android.intent.category.DEFAULT" /&
&/intent-filter&
&/activity&
注意: MobUIShell的路径是固定的,一定要在&cn.sharesdk.framework&下,因为它在Share-Core中。
之后,需要对上面的代码进行以下修改:
上图中,将红框部分的数字改成在腾讯开放平台申请到的AppId即可。
如果项目集成了微信,还需要添加以下WXEntryActivity,不然的话,mob后台无法做微信的分享统计:(在工程的包下新建wxapi目录再放置WXEntryActivity)
WXEntryActivity.java的代码如下:
* 官网地站:
* 技术支持QQ:
* 官方微信:ShareSDK
(如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也可以通过微信与我们取得联系,我们将会在24小时内给予回复)
* Copyright (c) 2013年 . All rights reserved.
8 package com.smyhvae.sharedemo.
9 import android.content.I
10 import android.widget.T
11 import cn.sharesdk.wechat.utils.WXAppExtendO
12 import cn.sharesdk.wechat.utils.WXMediaM
13 import cn.sharesdk.wechat.utils.WechatHandlerA
14 /** 微信客户端回调activity示例 */
15 public class WXEntryActivity extends WechatHandlerActivity {
* 处理微信发出的向第三方应用请求app message
* 在微信客户端中的聊天页面有&添加工具&,可以将本应用的图标添加到其中
* 此后点击图标,下面的代码会被执行。Demo仅仅只是打开自己而已,但你可
* 做点其他的事情,包括根本不打开任何页面
public void onGetMessageFromWXReq(WXMediaMessage msg) {
Intent iLaunchMyself = getPackageManager().getLaunchIntentForPackage(getPackageName());
startActivity(iLaunchMyself);
* 处理微信向第三方应用发起的消息
* 此处用来接收从微信发送过来的消息,比方说本demo在wechatpage里面分享
* 应用时可以不分享应用文件,而分享一段应用的自定义信息。接受方的微信
* 客户端会通过这个方法,将这个信息发送回接收方手机上的本demo中,当作
* 本Demo只是将信息展示出来,但你可做点其他的事情,而不仅仅只是Toast
public void onShowMessageFromWXReq(WXMediaMessage msg) {
if (msg != null && msg.mediaObject != null
&& (msg.mediaObject instanceof WXAppExtendObject)) {
WXAppExtendObject obj = (WXAppExtendObject) msg.mediaO
Toast.makeText(this, obj.extInfo, Toast.LENGTH_SHORT).show();
同时,在清单文件中进行声明:
&!--微信分享回调--&
android:name=".wxapi.WXEntryActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:exported="true"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Translucent.NoTitleBar"/&
如果项目继承了易信,方法类似,这里就不贴出来了,现在谁还用易信啊,哈哈哈&&&
4、添加代码:
集成ShareSDK至少需要在两个位置添加代码,包括:
(1)在项目的入口Activity,在其onCreate方法中插入下面的代码进行初始化:(这个方法越早调用越好)
ShareSDK.initSDK(this);
如果不在所有的ShareSDK的操作之前调用这行代码,就会抛出空指针异常。
(2)在项目出口Activity的onDestroy方法中第一行插入下面的代码:
ShareSDK.stopSDK(this);
&上方这行代码会结束ShareSDK的统计功能并释放资源。如果这行代码没有被调用,那么&应用启动次数&将会不准确,因为应用可能从来没有被关闭过(注:这一行代码我还是没用到,不知道会造成什么实质性的后果)。
注意:initSDK是可以重复调用的,其实ShareSDK建议在不确定的时候调用这个方法来保证ShareSDK被正确初始化。而stopSDK一旦被调用了,就必须重新调用initSDK才能使用ShareSDK的功能,否则会出现空指针异常。
在代码中调用此方法,即可打开一键分享功能进行分享:
1 private void showShare() {
ShareSDK.initSDK(this);
OnekeyShare oks = new OnekeyShare();
//关闭sso授权
oks.disableSSOWhenAuthorize();
6 // 分享时Notification的图标和文字
2.5.9以后的版本不调用此方法
//oks.setNotification(R.drawable.ic_launcher, getString(R.string.app_name));
// title标题,印象笔记、邮箱、信息、微信、人人网和QQ空间使用
oks.setTitle(getString(R.string.share));
// titleUrl是标题的网络链接,仅在人人网和QQ空间使用
oks.setTitleUrl("");
// text是分享文本,所有平台都需要这个字段
oks.setText("我是分享文本,啦啦啦~");
// imagePath是图片的本地路径,Linked-In以外的平台都支持此参数
oks.setImagePath("/sdcard/test.jpg");//确保SDcard下面存在此张图片
// url仅在微信(包括好友和朋友圈)中使用
oks.setUrl("");
// comment是我对这条分享的评论,仅在人人网和QQ空间使用
oks.setComment("我是测试评论文本");
// site是分享此内容的网站名称,仅在QQ空间使用
oks.setSite(getString(R.string.app_name));
// siteUrl是分享此内容的网站地址,仅在QQ空间使用
oks.setSiteUrl("");
24 // 启动分享GUI
oks.show(this);
上面的这些代码是官方给的,实际项目中可以放在按钮的点击事件中,根据需要去填写。
代码解释:
&&& 14行:setText是需要分享的文本内容
&&& 16行:setImagePath是需要分享的本地图片。(如果是在真机当中,需要通过api去拿sd卡的路径,即Environment.getExternalStorageDirectory()这个api)
五、正式开始写代码:
(1)activity_main.xml布局文件:
&LinearLayout xmlns:android="/apk/res/android"
xmlns:tools="/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity"&
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world"/&
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="分享按钮"/&
&/LinearLayout&
其实就是加了个button按钮,用做分享的事件触发。
(2)ShareSDK.xml中和新浪微博、微信、QQ有关的配置:
新浪微博:
&SinaWeibo
AppSecret="72d0fb99e35a7ba25364"
Enable="true"
RedirectUrl=""
ShareByAppClient="true"
SortId="1"/&
02行和03行的AppKey和AppSecret要换成你自己在新浪开放平台注册的信息。
06行:RedirectUrl里面的网址要改成可用的url地址,并且与新浪开放平台的授权回调页的网址一致,也就是下面这个:(在第三段中已经强调过了)
07行:如果设置为true,那就会用新浪微博的app来进行分享操作;如果你没有安装新浪微博的app,很可能会导致分享失败。如果设置为false,那就会用网页版的新浪微博进行分享。
微信和QQ的配置信息差不多,就不赘述了。
(3)MainActivity.java:
1 package com.smyhvae.
3 import android.app.A
4 import android.os.B
5 import android.view.V
6 import android.widget.B
8 import cn.sharesdk.framework.ShareSDK;
9 import cn.sharesdk.onekeyshare.OnekeyS
12 public class MainActivity extends Activity implements View.OnClickListener {
private Button button1;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button1 = (Button) findViewById(R.id.button1);
button1.setOnClickListener(this);
//点击按钮,开始进行分享
public void onClick(View v) {
ShareSDK.initSDK(this);
OnekeyShare oks = new OnekeyShare();
//关闭sso授权
oks.disableSSOWhenAuthorize();
// title标题:微信、QQ(新浪微博不需要标题)
oks.setTitle("我是分享标题");
//最多30个字符
// text是分享文本:所有平台都需要这个字段
oks.setText("我是分享文本,啦啦啦~/");
//最多40个字符
// imagePath是图片的本地路径:除Linked-In以外的平台都支持此参数
//oks.setImagePath(Environment.getExternalStorageDirectory() + "/meinv.jpg");//确保SDcard下面存在此张图片
//网络图片的url:所有平台
oks.setImageUrl("1.z0./CYSJ_02.jpg");//网络图片rul
// url:仅在微信(包括好友和朋友圈)中使用
oks.setUrl("");
//网友点进链接后,可以看到分享的详情
// Url:仅在QQ空间使用
oks.setTitleUrl("");
//网友点进链接后,可以看到分享的详情
// 启动分享GUI
oks.show(this);
&第39行中,如果不想用本地的图片,而是采用分享网络的图片,可以将这一行去掉,改为第42行。
提示:如果imagePath和imageUrl同时存在,imageUrl将被忽略。
六、运行效果:
1、分享到新浪微博:(不采用客户端进行分享的方式)
运行效果如下:
&第一次分享时,系统会弹出页面让你填写你自己的新浪微博账号,我第一次运行的时候已经填写过了。
现在打开新浪微博,分享成功了:
什么?你觉得分享的图片太小了不够刺激?那点开大图爽一下吧:(确实是分享成功了滴)
setText属性对应的是:&我是分享文本,啦啦啦~&
setImagePath属性对应的是需要分享的图片,也就是上图中的大美女。
2、分享到新浪微博:(采用客户端进行分享的方式)
运行之后,进行分享操作的界面如下:
分享成功之后的效果如下:
上图的左下角显示的是说&来自未通过审核应用&,但有时候会显示手机的名字,很奇怪吧?咨询了一下官方客服(官方客服的解答太耐心了,感激涕零),情况是这样的:
如果不用客户端进行分享(即ShareByAppClient="false"):
  app在新浪开放平台没通过审核,就会显示&未通过审核应用&
  app在新浪开放平台通过了审核,就会显示具体的app的名字
如果用客户端进行分享(即ShareByAppClient="true"):
  app在新浪开放平台没通过审核,就会显示&未通过审核应用&或者手机型号
  app在新浪开放平台通过了审核,显示的是手机型号。效果如下:
3、分享到微信:
我这里采用的是不绕过审核的方式来进行分享(即ShareSDK.xml中关于微信的部分中,BypassApproval="false")。一般也是采取这种方式进行分享的吧。到底要不要绕过,看官网博客便知:
  &微信分享(对比及配置):
提示:记得要将生成签名的apk安装到手机,不然无法分享到微信哦(好吧,仔细看微信开放平台的注册流程就行了)。
3.1& 分享到微信好友:
留在微信后,效果如下:
3.2 分享到微信朋友圈:
4、分享到QQ、QQ空间:(和分享到微信的过程和界面一致)
运行效果:
4.1、分享到QQ好友:
4.2、分享到QQ空间:
动态效果图如下:
如果你还需要做一些细微的调整,那就需要多看官方的东西了,这里贴出两个链接:
官网博客:&
【ShareSDK】常见问题汇总:
【工程文件】
七、在onekeyshare这个Module中对分享界面进行略微修改:
由于我们使用的是onekeyshare一键分享功能,于是分享界面在onekeyshare这个module中已经定制好了,现在可以进行略微的修改:
1、将每行多个分享按钮改为每行两个分享按钮:
这样的话,每排就是固定为两个分享按钮:
2、修改分享界面的背景:
可以在下面这个位置加背景:
上图中, 添加红框部分的代码即可。
八、完全自定义分享界面:
现在我想自定义成下面的这样的界面:
此时,由于我们是完全自定义界面,所以我们在集成的时候不需要集成onekeyshare模块(快捷分享)。也就是说,我们只需要让app这个module依赖于ShareSDK这个module就行了。
至于自定义的分享按钮的布局,我们需要一个GridView
代码实现:
(1)share_item.xml:
1 &?xml version="1.0" encoding="utf-8"?&
2 &RelativeLayout xmlns:android="/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="#00ffffff"
android:padding="30dp"
&ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:src="@mipmap/ic_launcher"/&
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/imageView1"
android:layout_centerHorizontal="true"
android:layout_marginTop="2dp"
android:text="TextView"/&
27 &/RelativeLayout&
(2)share_dialog.xml:
1 &?xml version="1.0" encoding="utf-8"?&
2 &LinearLayout xmlns:android="/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#00ffffff"
android:orientation="vertical"&
android:listSelector="@android:color/transparent"
android:id="@+id/share_gridView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@mipmap/share_bg"
android:gravity="center"
android:horizontalSpacing="1dp"
android:numColumns="2"
android:paddingBottom="10dp"
android:paddingTop="15dp"
android:paddingLeft="9dp"
android:paddingRight="8dp"
android:verticalSpacing="1dp"&
&/GridView&
&RelativeLayout
android:id="@+id/share_cancel"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="15dp"
android:layout_marginLeft="4dp"
android:layout_marginRight="4dp"
android:layout_marginTop="10dp"
android:background="@mipmap/share_cancle"
android:gravity="center"&
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="5dp"
android:layout_marginTop="5dp"
android:text="取消"
android:textColor="@color/home"
android:textSize="18sp"/&
&/RelativeLayout&
49 &/LinearLayout&
其实就是一个GridView和一个取消按钮。
为了达到UI上的效果,上面这两个布局文件的padding和margin我调了两个小时。唉&&&
(3)ShareDialog.java:
1 package com.smyhvae.
3 import android.app.AlertD
4 import android.content.C
5 import android.view.G
6 import android.view.View.OnClickL
7 import android.view.W
8 import android.widget.AdapterView.OnItemClickL
9 import android.widget.GridV
10 import android.widget.RelativeL
11 import android.widget.SimpleA
13 import java.util.ArrayL
14 import java.util.HashM
15 import java.util.L
17 public class ShareDialog {
private AlertD
private GridView gridV
private RelativeLayout cancelB
private SimpleAdapter saImageI
private int[] image = {R.mipmap.share_sina, R.mipmap.share_wechat, R.mipmap.share_wechat_moments, R.mipmap.share_qq};
private String[] name = {"微博", "微信好友", "朋友圈", "QQ"};
public ShareDialog(Context context) {
dialog = new AlertDialog.Builder(context).create();
dialog.show();
Window window = dialog.getWindow();
window.setGravity(Gravity.BOTTOM); // 非常重要:设置对话框弹出的位置
window.setContentView(R.layout.share_dialog);
gridView = (GridView) window.findViewById(R.id.share_gridView);
cancelButton = (RelativeLayout) window.findViewById(R.id.share_cancel);
List&HashMap&String, Object&& shareList = new ArrayList&HashMap&String, Object&&();
for (int i = 0; i & image. i++) {
HashMap&String, Object& map = new HashMap&String, Object&();
map.put("ItemImage", image[i]);//添加图像资源的ID
map.put("ItemText", name[i]);//按序号做ItemText
shareList.add(map);
saImageItems = new SimpleAdapter(context, shareList, R.layout.share_item, new String[]{"ItemImage", "ItemText"}, new int[]{R.id.imageView1, R.id.textView1});
gridView.setAdapter(saImageItems);
public void setCancelButtonOnClickListener(OnClickListener Listener) {
cancelButton.setOnClickListener(Listener);
public void setOnItemClickListener(OnItemClickListener listener) {
gridView.setOnItemClickListener(listener);
* 关闭对话框
public void dismiss() {
dialog.dismiss();
第31行是设置对话框弹出的位置。
(4)MainActivity.java:
1 package com.smyhvae.
3 import android.app.A
4 import android.os.B
5 import android.os.H
6 import android.os.M
7 import android.view.V
8 import android.widget.AdapterV
9 import android.widget.B
10 import android.widget.T
12 import java.util.HashM
14 import cn.sharesdk.framework.P
15 import cn.sharesdk.framework.Platform.ShareP
16 import cn.sharesdk.framework.PlatformActionL
17 import cn.sharesdk.framework.ShareSDK;
18 import cn.sharesdk.sina.weibo.SinaW
19 import cn.sharesdk.tencent.qq.QQ;
20 import cn.sharesdk.wechat.friends.W
21 import cn.sharesdk.wechat.moments.WechatM
24 public class MainActivity extends Activity implements View.OnClickListener,
PlatformActionListener {
private Button shareB
ShareDialog shareD
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
//1、分享的初始化
ShareSDK.initSDK(this);
private void initView() {
shareButton = (Button) findViewById(R.id.shareButton);
shareButton.setOnClickListener(this);
public void onClick(View v) {
switch (v.getId()) {
case R.id.shareButton:
shareDialog = new ShareDialog(this);
shareDialog.setCancelButtonOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
shareDialog.dismiss();
shareDialog.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView&?& arg0, View arg1,
int arg2, long arg3) {
HashMap&String, Object& item = (HashMap&String, Object&) arg0.getItemAtPosition(arg2);
if (item.get("ItemText").equals("微博")) {
//2、设置分享内容
ShareParams sp = new ShareParams();
sp.setText("我是分享文本,啦啦啦~/"); //分享文本
sp.setImageUrl("1.z0./CYSJ_02.jpg");//网络图片rul
//3、非常重要:获取平台对象
Platform sinaWeibo = ShareSDK.getPlatform(SinaWeibo.NAME);
sinaWeibo.setPlatformActionListener(MainActivity.this); // 设置分享事件回调
// 执行分享
sinaWeibo.share(sp);
} else if (item.get("ItemText").equals("微信好友")) {
Toast.makeText(MainActivity.this, "您点中了" + item.get("ItemText"), Toast.LENGTH_LONG).show();
//2、设置分享内容
ShareParams sp = new ShareParams();
sp.setShareType(Platform.SHARE_WEBPAGE);//非常重要:一定要设置分享属性
sp.setTitle("我是分享标题");
//分享标题
sp.setText("我是分享文本,啦啦啦~/");
//分享文本
sp.setImageUrl("1.z0./CYSJ_02.jpg");//网络图片rul
sp.setUrl("");
//网友点进链接后,可以看到分享的详情
//3、非常重要:获取平台对象
Platform wechat = ShareSDK.getPlatform(Wechat.NAME);
wechat.setPlatformActionListener(MainActivity.this); // 设置分享事件回调
// 执行分享
wechat.share(sp);
} else if (item.get("ItemText").equals("朋友圈")) {
//2、设置分享内容
ShareParams sp = new ShareParams();
sp.setShareType(Platform.SHARE_WEBPAGE); //非常重要:一定要设置分享属性
sp.setTitle("我是分享标题");
//分享标题
sp.setText("我是分享文本,啦啦啦~/");
//分享文本
sp.setImageUrl("1.z0./CYSJ_02.jpg");//网络图片rul
sp.setUrl("");
//网友点进链接后,可以看到分享的详情
//3、非常重要:获取平台对象
Platform wechatMoments = ShareSDK.getPlatform(WechatMoments.NAME);
wechatMoments.setPlatformActionListener(MainActivity.this); // 设置分享事件回调
// 执行分享
wechatMoments.share(sp);
} else if (item.get("ItemText").equals("QQ")) {
//2、设置分享内容
ShareParams sp = new ShareParams();
sp.setTitle("我是分享标题");
sp.setText("我是分享文本,啦啦啦~/");
sp.setImageUrl("1.z0./CYSJ_02.jpg");//网络图片rul
sp.setTitleUrl("");
//网友点进链接后,可以看到分享的详情
//3、非常重要:获取平台对象
Platform qq = ShareSDK.getPlatform(QQ.NAME);
qq.setPlatformActionListener(MainActivity.this); // 设置分享事件回调
// 执行分享
qq.share(sp);
shareDialog.dismiss();
public void onCancel(Platform arg0, int arg1) {//回调的地方是子线程,进行UI操作要用handle处理
handler.sendEmptyMessage(5);
public void onComplete(Platform arg0, int arg1, HashMap&String, Object& arg2) {//回调的地方是子线程,进行UI操作要用handle处理
if (arg0.getName().equals(SinaWeibo.NAME)) {// 判断成功的平台是不是新浪微博
handler.sendEmptyMessage(1);
} else if (arg0.getName().equals(Wechat.NAME)) {
handler.sendEmptyMessage(1);
} else if (arg0.getName().equals(WechatMoments.NAME)) {
handler.sendEmptyMessage(3);
} else if (arg0.getName().equals(QQ.NAME)) {
handler.sendEmptyMessage(4);
public void onError(Platform arg0, int arg1, Throwable arg2) {//回调的地方是子线程,进行UI操作要用handle处理
arg2.printStackTrace();
Message msg = new Message();
msg.what = 6;
msg.obj = arg2.getMessage();
handler.sendMessage(msg);
Handler handler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
Toast.makeText(getApplicationContext(), "微博分享成功", Toast.LENGTH_LONG).show();
Toast.makeText(getApplicationContext(), "微信分享成功", Toast.LENGTH_LONG).show();
Toast.makeText(getApplicationContext(), "朋友圈分享成功", Toast.LENGTH_LONG).show();
Toast.makeText(getApplicationContext(), "QQ分享成功", Toast.LENGTH_LONG).show();
Toast.makeText(getApplicationContext(), "取消分享", Toast.LENGTH_LONG).show();
Toast.makeText(getApplicationContext(), "分享失败啊" + msg.obj, Toast.LENGTH_LONG).show();
如果是分享到微信和朋友圈,那么第81行和第97行一定不能少哦,不然分享失败。
运行效果:
【工程文件】
参考链接:
  ShareSDK自定义界面+仿搜狐视频弹窗分享详解:
我开发的app已经上线了,但是客户要求说app要改名字,难以置信。毕竟app涉及到分享功能,所以改起来比较麻烦。
分享这一块儿要做的修改是:
1、新浪平台,可以直接在原来的应用中修改名字,然后提交审核。
2、微信平台,需要重新新建应用,然后提交审核。
3、腾讯平台:如果在原来的应用中改名字比较麻烦,还是重新新建应用吧。
我的公众号
下图是我的微信公众号(生命团队id:vitateam),欢迎有心人关注。博客园分享技术,公众号分享心智。
我会很感激第一批关注我的人。此时,年轻的我和你,一无所有;而后,富裕的你和我,满载而归。
阅读(...) 评论()

我要回帖

更多关于 使用花生壳发布应用 的文章

 

随机推荐