调整权限问题

This commit is contained in:
mwang 2019-06-29 22:47:08 +08:00
parent a871acb164
commit 31e55ab093
30 changed files with 726 additions and 393 deletions

View File

@ -13,8 +13,8 @@ android {
compileSdkVersion 28
buildToolsVersion "28.0.3"
defaultConfig {
// applicationId "com.qq.e.union.demo"
applicationId "com.zhushou.yueshu"
applicationId "com.novelbook.android"
// applicationId "com.zhushou.yueshu"
minSdkVersion 19 //target 19 Android 4.4 4.1%
targetSdkVersion 28
versionCode 6
@ -52,7 +52,7 @@ android {
}
release {
// Log 线
buildConfigField "boolean", "LOG_DEBUG", "true"
buildConfigField "boolean", "LOG_DEBUG", "false"
//
minifyEnabled true
//Zipalign优化
@ -71,7 +71,6 @@ android {
outputFileName = fileName;
}
}
}*/
signingConfig signingConfigs.releaseConfig
}
@ -79,33 +78,11 @@ android {
//
/*productFlavors {
// googleplay {}
yingyonghui {
g {
applicationId "com.zhushou.yueshu"
versionName "v1.0"
buildConfigField "String", "MAIN_HOST", '"http://g.xiaoshuofenxiang.com/api/"'
buildConfigField "String", "API_HOST", '"{\\"master\\":[\\"http:\\\\/\\\\/g.xiaoshuofenxiang.com\\"],\\"page\\":[\\"http:\\\\/\\\\/p.xiaoshuofenxiang.com\\"],\\"report\\":[\\"http:\\\\/\\\\/r.xiaoshuofenxiang.com\\"],\\"search\\":[\\"http:\\\\/\\\\/s.xiaoshuofenxiang.com\\"],\\"novel\\":[\\"http:\\\\/\\\\/n.xiaoshuofenxiang.com\\"],\\"novelsbydot\\":[\\"http:\\\\/\\\\/nbd.xiaoshuofenxiang.com\\"],\\"user\\":[\\"http:\\\\/\\\\/u.xiaoshuofenxiang.com\\"]}"'
}
yiwan {
applicationId "com.zhushou.yueshu"
versionName "v1.0"
buildConfigField "String", "MAIN_HOST", '"http://g.xiaoshuofenxiang.com/api/"'
buildConfigField "String", "API_HOST", '"{\\"master\\":[\\"http:\\\\/\\\\/g.xiaoshuofenxiang.com\\"],\\"page\\":[\\"http:\\\\/\\\\/p.xiaoshuofenxiang.com\\"],\\"report\\":[\\"http:\\\\/\\\\/r.xiaoshuofenxiang.com\\"],\\"search\\":[\\"http:\\\\/\\\\/s.xiaoshuofenxiang.com\\"],\\"novel\\":[\\"http:\\\\/\\\\/n.xiaoshuofenxiang.com\\"],\\"novelsbydot\\":[\\"http:\\\\/\\\\/nbd.xiaoshuofenxiang.com\\"],\\"user\\":[\\"http:\\\\/\\\\/u.xiaoshuofenxiang.com\\"]}"'
}
haote {
applicationId "com.zhushou.yueshu"
versionName "v1.0"
buildConfigField "String", "MAIN_HOST", '"http://g.xiaoshuofenxiang.com/api/"'
buildConfigField "String", "API_HOST", '"{\\"master\\":[\\"http:\\\\/\\\\/g.xiaoshuofenxiang.com\\"],\\"page\\":[\\"http:\\\\/\\\\/p.xiaoshuofenxiang.com\\"],\\"report\\":[\\"http:\\\\/\\\\/r.xiaoshuofenxiang.com\\"],\\"search\\":[\\"http:\\\\/\\\\/s.xiaoshuofenxiang.com\\"],\\"novel\\":[\\"http:\\\\/\\\\/n.xiaoshuofenxiang.com\\"],\\"novelsbydot\\":[\\"http:\\\\/\\\\/nbd.xiaoshuofenxiang.com\\"],\\"user\\":[\\"http:\\\\/\\\\/u.xiaoshuofenxiang.com\\"]}"'
}
anzhi {
applicationId "com.zhushou.yueshu"
versionName "v1.0"
buildConfigField "String", "MAIN_HOST", '"http://g.xiaoshuofenxiang.com/api/"'
buildConfigField "String", "API_HOST", '"{\\"master\\":[\\"http:\\\\/\\\\/g.xiaoshuofenxiang.com\\"],\\"page\\":[\\"http:\\\\/\\\\/p.xiaoshuofenxiang.com\\"],\\"report\\":[\\"http:\\\\/\\\\/r.xiaoshuofenxiang.com\\"],\\"search\\":[\\"http:\\\\/\\\\/s.xiaoshuofenxiang.com\\"],\\"novel\\":[\\"http:\\\\/\\\\/n.xiaoshuofenxiang.com\\"],\\"novelsbydot\\":[\\"http:\\\\/\\\\/nbd.xiaoshuofenxiang.com\\"],\\"user\\":[\\"http:\\\\/\\\\/u.xiaoshuofenxiang.com\\"]}"'
buildConfigField "String", "API_HOST", '""'
}
@ -113,7 +90,7 @@ android {
applicationId "com.zhushou.yueshu"
versionName "v1.0"
buildConfigField "String", "MAIN_HOST", '"http://g.xiaoshuofenxiang.com/api/"'
buildConfigField "String", "API_HOST", '"{\\"master\\":[\\"http:\\\\/\\\\/g.xiaoshuofenxiang.com\\"],\\"page\\":[\\"http:\\\\/\\\\/p.xiaoshuofenxiang.com\\"],\\"report\\":[\\"http:\\\\/\\\\/r.xiaoshuofenxiang.com\\"],\\"search\\":[\\"http:\\\\/\\\\/s.xiaoshuofenxiang.com\\"],\\"novel\\":[\\"http:\\\\/\\\\/n.xiaoshuofenxiang.com\\"],\\"novelsbydot\\":[\\"http:\\\\/\\\\/nbd.xiaoshuofenxiang.com\\"],\\"user\\":[\\"http:\\\\/\\\\/u.xiaoshuofenxiang.com\\"]}"'
buildConfigField "String", "API_HOST", '""'
}
//
@ -188,7 +165,8 @@ dependencies {
implementation 'com.umeng.umsdk:common:2.0.2'
implementation 'q.rorbin:VerticalTabLayout:1.2.5'
implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.16'
implementation(name: 'open_ad_sdk', ext: 'aar')
// implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.6'
//穿广
// implementation(name: 'open_ad_sdk', ext: 'aar')
implementation 'com.google.android.gms:play-services-ads:17.2.1'
// implementation 'com.yanzhenjie:permission:2.0.0'
}

View File

@ -6,9 +6,10 @@
<uses-permission android:name="android.permission.INTERNET" /> <!-- <uses-permission android:name="android.permission.VIBRATE" /> -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<!-- chanshanjia-->
<uses-permission android:name="android.permission.GET_TASKS"/>
<!--<uses-permission android:name="android.permission.WAKE_LOCK" />-->
@ -162,7 +163,7 @@
</activity>
-->
<uses-library
<!-- <uses-library
android:name="org.apache.http.legacy"
android:required="false" />
@ -178,8 +179,9 @@
<provider
android:name="com.bytedance.sdk.openadsdk.multipro.TTMultiProvider"
android:authorities="${applicationId}.TTMultiProvider"
android:exported="false" />
android:exported="false" />-->
<!-- chuanshanjia ad end-->
<!--
<provider
android:name="android.support.v4.content.FileProvider"

View File

@ -23,9 +23,9 @@ import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;
import com.bytedance.sdk.openadsdk.AdSlot;
/*import com.bytedance.sdk.openadsdk.AdSlot;
import com.bytedance.sdk.openadsdk.TTAdNative;
import com.bytedance.sdk.openadsdk.TTSplashAd;
import com.bytedance.sdk.openadsdk.TTSplashAd;*/
import com.google.android.gms.ads.AdListener;
import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.InterstitialAd;
@ -97,7 +97,7 @@ public class SplashActivity extends Activity implements WeakHandler.IHandler, Sp
//------toutiao--->
private TTAdNative mTTAdNative;
//private TTAdNative mTTAdNative;
//是否强制跳转到主页面
private boolean mForceGoMain;
@ -123,6 +123,7 @@ public class SplashActivity extends Activity implements WeakHandler.IHandler, Sp
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
boolean isGoToMain= getIntent().getBooleanExtra(EXTR_LUNCHER,true);
Log.d(TAG, String.format("onCreate: isGotoMain %s,showAd %s",isGoToMain,Constants.AD_SETTING.isShowAdsense()));
if(!Constants.AD_SETTING.isShowAdsense() ||isGoToMain && !Constants.AD_SETTING.getSplash().isShow() ){
goToMainActivity();
return;
@ -133,8 +134,9 @@ public class SplashActivity extends Activity implements WeakHandler.IHandler, Sp
if (Constants.AD_SETTING.getSplash().getSource() == Constants.AD_TENCENT_QQ) {
rid = R.layout.ad_qq_activity_splash;
} else if (Constants.AD_SETTING.getSplash().getSource() == Constants.AD_TOUTIAO) {
rid = R.layout.ad_toutiao_activity_splash;
splashSource=Constants.AD_TOUTIAO;
/* rid = R.layout.ad_toutiao_activity_splash;
splashSource=Constants.AD_TOUTIAO;*/
goToMainActivity();return;
}
else{
goToMainActivity();return;
@ -176,7 +178,7 @@ public class SplashActivity extends Activity implements WeakHandler.IHandler, Sp
tvTitle.setText(R.string.app_name);
//加载开屏广告
if(splashSource == Constants.AD_TOUTIAO ) {
mHandler.sendEmptyMessageDelayed(MSG_GO_MAIN, AD_TIME_OUT);
/* mHandler.sendEmptyMessageDelayed(MSG_GO_MAIN, AD_TIME_OUT);
//step2:创建TTAdNative对象
try {
mTTAdNative = TTAdManagerHolder.get().createAdNative(this);
@ -184,7 +186,7 @@ public class SplashActivity extends Activity implements WeakHandler.IHandler, Sp
goToMainActivity();
return;
}
loadSplashAd();
loadSplashAd();*/
}else if(splashSource == Constants.AD_TENCENT_QQ ){
if (Build.VERSION.SDK_INT >= 23) {
checkAndRequestPermission();
@ -254,7 +256,7 @@ public class SplashActivity extends Activity implements WeakHandler.IHandler, Sp
/**
* 加载开屏广告
*/
private void loadSplashAd() {
/*private void loadSplashAd() {
//step3:创建开屏广告请求参数AdSlot,具体参数含义参考文档
AdSlot adSlot = new AdSlot.Builder()
.setCodeId(Constants.AD_SETTING.getSplash().getSlotId(Constants.AD_TOUTIAO) )
@ -329,7 +331,7 @@ public class SplashActivity extends Activity implements WeakHandler.IHandler, Sp
});
}
}, AD_TIME_OUT);
}
}*/
private void showToast(String msg) {
@ -405,7 +407,7 @@ public class SplashActivity extends Activity implements WeakHandler.IHandler, Sp
String[] requestPermissions = new String[lackedPermission.size()];
lackedPermission.toArray(requestPermissions);
Log.d(TAG, String.format("checkAndRequestPermission: lacked permission size %s",requestPermissions.length));
requestPermissions(requestPermissions, 1024);
// requestPermissions(requestPermissions, 1024);
}
}

View File

@ -1,6 +1,6 @@
package com.novelbook.android.AD.toutiao;
import android.content.Context;
/*import android.content.Context;
import android.text.TextUtils;
import android.util.Log;
@ -11,13 +11,28 @@ import com.bytedance.sdk.openadsdk.TTAdSdk;
import com.novelbook.android.BuildConfig;
import com.novelbook.android.utils.Constants;
import static com.novelbook.android.bean.AdSetting.getAppID;
import static com.novelbook.android.bean.AdSetting.getAppID;*/
import android.content.Context;
/**
* 可以用一个单例来保存TTAdManager实例在需要初始化sdk的时候调用
*/
public class TTAdManagerHolder {
//step1:接入网盟广告sdk的初始化操作详情见接入文档和穿山甲平台说明
private static void doInit(Context context) {
/* if (!sInit) {
TTAdSdk.init(context, buildConfig(context));
sInit = true;
}*/
}
public static void init(Context context) {
/* if( Constants.AD_SETTING.isShowAdsense() &&
!TextUtils.isEmpty(getAppID(Constants.AD_TOUTIAO)) ) {
doInit(context);
}*/
}
/*
private static boolean sInit;
public static TTAdManager get() {
@ -34,13 +49,7 @@ public class TTAdManagerHolder {
}
}
//step1:接入网盟广告sdk的初始化操作详情见接入文档和穿山甲平台说明
private static void doInit(Context context) {
if (!sInit) {
TTAdSdk.init(context, buildConfig(context));
sInit = true;
}
}
private static TTAdConfig buildConfig(Context context) {
@ -59,8 +68,8 @@ public class TTAdManagerHolder {
// .age(20) //TODO: 年龄收集
.build();
}
}*/
public static void initOnSexChange(Context context){
buildConfig(context);
// buildConfig(context);
}
}

View File

@ -4,19 +4,30 @@ import android.Manifest;
import android.annotation.TargetApi;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.graphics.Point;
import android.location.LocationManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.provider.Settings;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.StringRes;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MenuItem;
@ -29,21 +40,20 @@ import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.androidquery.AQuery;
import com.androidquery.callback.AQuery2;
import com.androidquery.callback.ImageOptions;
/*import com.androidquery.AQuery;
import com.androidquery.callback.AQuery2;
import com.bytedance.sdk.openadsdk.AdSlot;
import com.bytedance.sdk.openadsdk.TTAdConstant;
import com.bytedance.sdk.openadsdk.TTAdDislike;
import com.bytedance.sdk.openadsdk.TTAdNative;
import com.bytedance.sdk.openadsdk.TTAppDownloadListener;
import com.bytedance.sdk.openadsdk.TTBannerAd;
import com.bytedance.sdk.openadsdk.TTFeedAd;
import com.bytedance.sdk.openadsdk.TTImage;
import com.bytedance.sdk.openadsdk.TTInteractionAd;
import com.bytedance.sdk.openadsdk.TTNativeAd;
import com.bytedance.sdk.openadsdk.TTNativeAd;*/
import com.google.android.gms.ads.AdListener;
import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.AdSize;
@ -57,6 +67,7 @@ import com.novelbook.android.db.Novel;
import com.novelbook.android.netutils.NetUtil;
//import com.novelbook.android.permision.RuntimeRationale;
import com.novelbook.android.upgrade.UpdateManager;
import com.novelbook.android.utils.CommonUtil;
@ -89,19 +100,25 @@ import com.qq.e.ads.nativ.NativeUnifiedADData;
import com.qq.e.comm.constants.AdPatternType;
import com.qq.e.comm.pi.AdData;
import com.qq.e.comm.util.AdError;
/*import com.yanzhenjie.permission.Action;
import com.yanzhenjie.permission.AndPermission;
import com.yanzhenjie.permission.runtime.Permission;*/
import org.litepal.BuildConfig;
import org.litepal.util.Const;
import butterknife.BindView;
import butterknife.ButterKnife;
import static com.novelbook.android.FileActivity.EXTERNAL_STORAGE_REQ_CODE;
import static com.novelbook.android.bean.AdSetting.getAppID;
import static com.novelbook.android.utils.Constants.AD_MOB;
import static com.novelbook.android.utils.Constants.AD_TENCENT_QQ;
import static com.novelbook.android.utils.Constants.AD_TOUTIAO;
public abstract class Activity_base extends AppCompatActivity implements NativeExpressAD.NativeExpressADListener,UnifiedBannerADListener {
private final int REQUEST_CODE_SETTING=1;
private static final int MSG_AD_LOAD =10 ;
private static String TAG ="Activity_base";
private ProgressDialog mProgressDialog;
@ -112,6 +129,7 @@ public abstract class Activity_base extends AppCompatActivity implements Native
//---qq ad---->
private NativeExpressAD nativeExpressAD;
private NativeExpressADView nativeExpressADView;
private QqNadListiner qqNadListiner;
//---qq ad end----
@Nullable
@BindView(R.id.toolbar)
@ -153,7 +171,7 @@ public abstract class Activity_base extends AppCompatActivity implements Native
ButterKnife.bind(this);
setupToolbar();
// 初始化View注入
this.mAQuery = new AQuery2(this);
// this.mAQuery = new AQuery2(this);
initializeAd();//initAD_TouTiao();
setTitle();
initData();
@ -163,31 +181,7 @@ public abstract class Activity_base extends AppCompatActivity implements Native
checkAndRequestPermission();
}
}
@TargetApi(Build.VERSION_CODES.M)
private void checkAndRequestPermission() {
List<String> lackedPermission = new ArrayList<String>();
if (!(checkSelfPermission(Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED)) {
lackedPermission.add(Manifest.permission.READ_PHONE_STATE);
}
if (!(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)) {
lackedPermission.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
if (!(checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED)) {
lackedPermission.add(Manifest.permission.ACCESS_FINE_LOCATION);
}
// 请求所缺少的权限在onRequestPermissionsResult中再看是否获得权限如果获得权限就可以调用SDK否则不要调用SDK
String[] requestPermissions = new String[lackedPermission.size()];
if(requestPermissions.length>0) {
lackedPermission.toArray(requestPermissions);
requestPermissions(requestPermissions, 1024);
}
}
void initNaviBanner(){
if(mBannerContainer==null){
return;
@ -382,9 +376,164 @@ public abstract class Activity_base extends AppCompatActivity implements Native
* @param errorText
*/
protected void checkPermission (Activity thisActivity, String permission, int requestCode, String errorText) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
CommonUtil.checkPermission(thisActivity,permission,requestCode,errorText);
}
}
@TargetApi(Build.VERSION_CODES.M)
public void checkAndRequestPermission() {
List<String> lackedPermission = new ArrayList<String>();
if (!(checkSelfPermission(Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED)) {
lackedPermission.add(Manifest.permission.READ_PHONE_STATE);
// CommonUtil.checkPermission(this,Manifest.permission.READ_PHONE_STATE,1024,"识别用户身份需要此权限,请允许");
// return;
}
if (!(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)) {
lackedPermission.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
// CommonUtil.checkPermission(this,Manifest.permission.WRITE_EXTERNAL_STORAGE,1024,"缓存小说内容需此权限,请允许");
// return;
}
if(com.novelbook.android.BuildConfig.LOG_DEBUG || Constants.AD_SETTING.isShowAdsense() && Constants.AD_SETTING.getSplash().getSource() == AD_TENCENT_QQ)
if (!(checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED)) {
lackedPermission.add(Manifest.permission.ACCESS_FINE_LOCATION);
// CommonUtil.checkPermission(this,Manifest.permission.ACCESS_FINE_LOCATION,1024,"精确推送小说内容需此权限,请允许");
Log.e(TAG, "checkAndRequestPermission: ACCESS_FINE_LOCATION result " + checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) );
// return;
}
if(com.novelbook.android.BuildConfig. LOG_DEBUG || Constants.AD_SETTING.isShowAdsense() && Constants.AD_SETTING.getSplash().getSource() == AD_TENCENT_QQ)
if (!(checkSelfPermission(Manifest.permission.REQUEST_INSTALL_PACKAGES) == PackageManager.PERMISSION_GRANTED)) {
// CommonUtil.checkPermission(this,Manifest.permission.REQUEST_INSTALL_PACKAGES,1024,"更新程序内容需此权限,请允许");
lackedPermission.add(Manifest.permission.REQUEST_INSTALL_PACKAGES);
// return;
}
// 请求所缺少的权限在onRequestPermissionsResult中再看是否获得权限如果获得权限就可以调用SDK否则不要调用SDK
String[] requestPermissions = new String[lackedPermission.size()];
if(requestPermissions.length>0) {
lackedPermission.toArray(requestPermissions);
requestPermissions(requestPermissions, 1024);
String p = "";
for(String s: requestPermissions) {
p+="," +s;
}
if(requestPermissions.length>0){
p =p.substring(1);
Log.e(TAG, "checkAndRequestPermission: 缺少权限 " + p);
//requestPermission(this,p);
}
}
}
private boolean hasAllPermissionsGranted(int[] grantResults) {
for (int grantResult : grantResults) {
Log.e(TAG, "checkAndRequestPermission: grant result "+grantResult );
if (grantResult == PackageManager.PERMISSION_DENIED) {
return false;
}
}
return true;
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == 1024 && hasAllPermissionsGranted(grantResults)) {
} else {
Log.d(TAG, String.format("checkAndRequestPermission: permision result requestCode %s,",requestCode ));
// 如果用户没有授权那么应该说明意图引导用户去设置里面授权
Toast.makeText(this, "应用缺少必要的权限!请点击\"权限\",打开所需要的权限。", Toast.LENGTH_LONG).show();
// Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
// intent.setData(Uri.parse("package:" + getPackageName()));
// startActivity(intent);
}
}
/**
* Request permissions.
*/
/* private void requestPermission(Context activity, String... permissions) {
AndPermission.with(activity)
.runtime()
.permission(permissions)
.rationale(new RuntimeRationale())
.onGranted(new Action<List<String>>() {
@Override
public void onAction(List<String> permissions) {
toast(R.string.permision_successfully);
}
})
.onDenied(new Action<List<String>>() {
@Override
public void onAction(@NonNull List<String> permissions) {
toast(R.string.permision_failure);
if (AndPermission.hasAlwaysDeniedPermission( activity, permissions)) {
showSettingDialog(activity, permissions);
}
}
})
.start();
}
*//**
* Display setting dialog.
*//*
public void showSettingDialog(Context context, final List<String> permissions) {
List<String> permissionNames = Permission.transformText(context, permissions);
String message = context.getString(R.string.message_permission_always_failed,
TextUtils.join("\n", permissionNames));
new AlertDialog.Builder(context).setCancelable(false)
.setTitle(R.string.title_dialog)
.setMessage(message)
.setPositiveButton(R.string.setting, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
setPermission();
}
})
.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
})
.show();
}
*//**
* Set permissions.
*//*
private void setPermission() {
AndPermission.with(this).runtime().setting().start(REQUEST_CODE_SETTING);
}
*/
protected void toast(@StringRes int message) {
Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
switch (requestCode) {
case REQUEST_CODE_SETTING: {
Toast.makeText( this, R.string.message_setting_comeback, Toast.LENGTH_SHORT).show();
break;
}
}
}
protected void loadImageView(String url, ImageView imageView){
ImageUtil.loadImage( this, url , imageView);
}
@ -440,7 +589,7 @@ public abstract class Activity_base extends AppCompatActivity implements Native
if(Constants.AD_SETTING.getChapterContentBanner().getSource() == AD_TENCENT_QQ) {
loadNativeBanner_qq(-1, 388);
}else if(Constants.AD_SETTING.getChapterContentBanner().getSource() == AD_TOUTIAO) {
loadNativeBanner_toutiao(mBannerContainer ,690,388);
// loadNativeBanner_toutiao(mBannerContainer ,690,388);
}else if(Constants.AD_SETTING.getChapterContentBanner().getSource() == AD_MOB) {
loadBanner_Mob(mBannerContainer, 699,388);
}
@ -463,7 +612,7 @@ public abstract class Activity_base extends AppCompatActivity implements Native
if(Constants.AD_SETTING.getChapterBanner().getSource()== AD_TENCENT_QQ) {
getBanner_qq();
}else if(Constants.AD_SETTING.getChapterBanner().getSource()== AD_TOUTIAO) {
loadBanner_toutiao(mBannerContainer, width,height);
// loadBanner_toutiao(mBannerContainer, width,height);
}else if(Constants.AD_SETTING.getChapterBanner().getSource()== AD_MOB){
loadBanner_Mob(mBannerContainer, width,height);
@ -473,13 +622,14 @@ public abstract class Activity_base extends AppCompatActivity implements Native
void initializeAd(){
if(Constants.AD_SETTING.isShowAdsense()) {
initAD_TouTiao();
// initAD_TouTiao();
qqNadListiner = new QqNadListiner() ;
// initialMobileAd();
}
}
//------ 头条 ad -----
AQuery2 mAQuery;
/*AQuery2 mAQuery;
Button mCreativeButton;
TTAdNative mTTAdNative;
void initAD_TouTiao(){
@ -503,10 +653,11 @@ public abstract class Activity_base extends AppCompatActivity implements Native
}
return mTTAdNative;
}
*/
/*
//----toutiao ad ----
// boolean mShowAd =false;
@ -514,6 +665,7 @@ public abstract class Activity_base extends AppCompatActivity implements Native
//step4:创建广告请求参数AdSlot,具体参数含义参考文档
if(!Constants.AD_SETTING.isShowAdsense() || getTTAdNative()==null ){return;}
String codeId = Constants.AD_SETTING.getChapterBanner().getSlotId(Constants.AD_TOUTIAO) ;
*/
/* if(height >390){
width =(int)(height*1.78);
if(width > Constants.SCREEN_WIDTH_PIX-50 ){
@ -522,7 +674,8 @@ public abstract class Activity_base extends AppCompatActivity implements Native
}
}else if(height >150){
width =(int)(height*1.78);
}*/
}*//*
// width =690;
//height=150;
// height=height > 500 ? 500: height;
@ -589,26 +742,7 @@ public abstract class Activity_base extends AppCompatActivity implements Native
}
});
//获取网盟dislike dialog您可以在您应用中本身自定义的dislike icon 按钮中设置 mTTAdDislike.showDislikeDialog();
/*mTTAdDislike = ad.getDislikeDialog(new TTAdDislike.DislikeInteractionCallback() {
@Override
public void onSelected(int position, String value) {
TToast.show(mContext, "点击 " + value);
}
@Override
public void onCancel() {
TToast.show(mContext, "点击取消 ");
}
});
if (mTTAdDislike != null) {
XXX.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mTTAdDislike.showDislikeDialog();
}
});
} */
}
});
@ -728,13 +862,16 @@ public abstract class Activity_base extends AppCompatActivity implements Native
toutiaoNati_Banner_AdCache.containsKey(key)?toutiaoNati_Banner_AdCache.get(key).size() :0
));
}
*/
/* if (!toutiaoNati_Banner_AdCache.containsKey(key)){
loadNativeBannerAd(bannerContainer, codeId, width, height);
Log.d(TAG, String.format("loadNativeBannerAd: load again ... containsKey(key) ? %s,ads size %s",toutiaoNati_Banner_AdCache.containsKey(key),
toutiaoNati_Banner_AdCache.containsKey(key)?toutiaoNati_Banner_AdCache.get(key).size() :0
));
}*/
}*//*
*/
/* if (ads.get(0) == null || !mShowAd) {
return;
}
@ -753,7 +890,8 @@ public abstract class Activity_base extends AppCompatActivity implements Native
bannerContainer.setBackgroundResource(R.color.mintcream); // @color/mintcream
Log.d(TAG, "loadBannerAd: set banner VISIBLE,mShowAd " + mShowAd);
//绑定原生广告的数据
setAdData(bannerContainer, bannerView, ads.get(0));*/
setAdData(bannerContainer, bannerView, ads.get(0));*//*
// mTTAdNative.loadNativeAd(adSlot,null);
}
});
@ -1047,10 +1185,12 @@ public abstract class Activity_base extends AppCompatActivity implements Native
});
}
*/
/**
* 加载 toutiao feed广告
*/
public void loadListAd_toutiao(BookListAdapter adapter, int adCnt, boolean addFooter) {
*//*
private void loadListAd_toutiao(BookListAdapter adapter, int adCnt, boolean addFooter) {
//feed广告请求类型参数
AdSlot adSlot = new AdSlot.Builder()
.setCodeId( Constants.AD_SETTING.getInformationFlow().getSlotId(Constants.AD_TOUTIAO) )
@ -1083,6 +1223,7 @@ public abstract class Activity_base extends AppCompatActivity implements Native
}
});
}
*/
// qq ad ------------------------------begin
@ -1496,6 +1637,113 @@ public abstract class Activity_base extends AppCompatActivity implements Native
}
// qq ad ------------------------------begin
private boolean qqAddFooter;
private BookListAdapter qqAdapter;
private NativeExpressAD mADManager;
void loadListAd_qq(BookListAdapter adapter, int adCnt, boolean addFooter) {
ADSize adSize = new ADSize(ADSize.FULL_WIDTH, ADSize.AUTO_HEIGHT); // 消息流中用AUTO_HEIGHT
mADManager = new NativeExpressAD(this, adSize, getAppID(Constants.AD_TENCENT_QQ) ,
Constants.AD_SETTING.getInformationFlow().getSlotId(Constants.AD_TENCENT_QQ) , qqNadListiner);
mADManager.setMaxVideoDuration(5);
mADManager.loadAD(adCnt);
qqAdapter =adapter;
qqAddFooter=addFooter;
Log.d(TAG, "loadListAd_qq: ad requested");
}
class QqNadListiner implements NativeExpressAD.NativeExpressADListener{
@Override
public void onADCloseOverlay(NativeExpressADView adView) {
Log.i(TAG, "onADCloseOverlay");
}
@Override
public void onADLoaded(List<NativeExpressADView> adList) {
Log.i(TAG, "onADLoaded: " + adList.size());
if(qqAdapter==null){
return;
}
if(qqAddFooter) {
qqAdapter.AddFooterItem(adList);
}else{
qqAdapter.AddHeaderItem(adList);
}
}
@Override
public void onRenderFail(NativeExpressADView adView) {
Log.i(TAG, "onRenderFail: " + adView.toString());
}
@Override
public void onRenderSuccess(NativeExpressADView adView) {
// Log.i(TAG, "onRenderSuccess: " + adView.toString() + ", adInfo: " + getAdInfo(adView));
}
@Override
public void onADExposure(NativeExpressADView adView) {
Log.i(TAG, "onADExposure: " + adView.toString());
}
@Override
public void onADClicked(NativeExpressADView adView) {
Log.i(TAG, "onADClicked: " + adView.toString());
}
@Override
public void onADClosed(NativeExpressADView adView) {
Log.i(TAG, "onADClosed: " + adView.toString());
/* if (mAdapter != null) {
int removedPosition = mAdViewPositionMap.get(adView);
mAdapter.removeADView(removedPosition, adView);
}*/
}
@Override
public void onADLeftApplication(NativeExpressADView adView) {
Log.i(TAG, "onADLeftApplication: " + adView.toString());
}
@Override
public void onADOpenOverlay(NativeExpressADView adView) {
Log.i(TAG, "onADOpenOverlay: " + adView.toString());
}
@Override
public void onNoAD(AdError adError) {
Log.d(TAG, "loadListAd_qq: ad onNoAD " );
Log.i(
TAG,
String.format("onNoAD, error code: %d, error msg: %s", adError.getErrorCode(),
adError.getErrorMsg()));
}
}
//qq ad end<-------------
/**
* 加载 toutiao feed广告
*/
public void loadListAd( BookListAdapter adapter, int adCnt, boolean addFooter) {
if(!Constants.AD_SETTING.isShowAdsense() || !Constants.AD_SETTING.getInformationFlow().isShow()){
return;
}
if(Constants.AD_SETTING.getInformationFlow().getSource()==Constants.AD_TENCENT_QQ) {
loadListAd_qq(adapter, adCnt, addFooter);
}else if(Constants.AD_SETTING.getInformationFlow().getSource()==Constants.AD_TOUTIAO){
// loadListAd_toutiao(adapter, adCnt, addFooter);
}
}
@Override
protected void onResume() {
super.onResume();

View File

@ -203,10 +203,8 @@ public class BookActivity extends Activity_base {
@Override
protected void initData() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
checkPermission(BookActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE, EXTERNAL_STORAGE_REQ_CODE, "添加图书需要此权限,请允许");
}
pageFactory = PageFactory.getInstance(getApplicationContext());
// pageFactory.clear();
setBookInfo();//set title ,data from novel list
@ -252,7 +250,7 @@ public class BookActivity extends Activity_base {
rvBooklistAuthor.setLayoutManager(new LinearLayoutManager(this));
rvBooklistAuthor.setAdapter(mAdapterAuthor);
loadListAd_toutiao(mAdapterAuthor, 1 ,false);
loadListAd(mAdapterAuthor, 1 ,false);
}
private void setNovelsRelated(){
@ -271,7 +269,7 @@ public class BookActivity extends Activity_base {
rvBooklistRelated.setLayoutManager(new LinearLayoutManager(this));
rvBooklistRelated.setAdapter(mAdapterRelated);
loadListAd_toutiao(mAdapterRelated, 1 ,false);
loadListAd (mAdapterRelated, 1 ,false);
}
/**

View File

@ -31,19 +31,9 @@ import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.bumptech.glide.Glide;
import com.bytedance.sdk.openadsdk.AdSlot;
import com.bytedance.sdk.openadsdk.TTAdDislike;
import com.bytedance.sdk.openadsdk.TTAdNative;
import com.bytedance.sdk.openadsdk.TTAppDownloadListener;
import com.bytedance.sdk.openadsdk.TTBannerAd;
import com.bytedance.sdk.openadsdk.TTFeedAd;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.novelbook.android.AD.toutiao.TToast;
import com.novelbook.android.Activity_base;
import com.novelbook.android.Activity_paihangbang;
@ -95,7 +85,7 @@ import static com.novelbook.android.bean.AdSetting.getAppID;
/**
* A simple {@link Fragment} subclass.
*/
public abstract class BasicFragment extends Fragment implements /* NativeADUnifiedListener,*/NativeExpressAD.NativeExpressADListener {
public abstract class BasicFragment extends Fragment /*implements NativeADUnifiedListener,NativeExpressAD.NativeExpressADListener*/ {
private static String TAG = BasicFragment.class.getSimpleName();
protected View rootView;
@ -163,7 +153,7 @@ public abstract class BasicFragment extends Fragment implements /* NativeADUnif
initData();
initViews();
initSwipeRefreshLayout();
if (mBannerContainer!=null && !Constants.AD_SETTING.isShowAdsense()) {
if (mBannerContainer!=null && (!Constants.AD_SETTING.isShowAdsense() || !Constants.AD_SETTING.getFixBanner().isShow() )) {
if( mBannerContainer.getVisibility() !=View.GONE) {
mBannerContainer.setVisibility(View.GONE);
}
@ -480,147 +470,8 @@ void initTabs(){
if( mBannerContainer.getVisibility() !=View.VISIBLE)
mBannerContainer.setVisibility(View.VISIBLE);
}
// qq ad ------------------------------begin
/* private NativeUnifiedAD mAdManager;
private List<NativeUnifiedADData> mAds = new ArrayList<>();
public void loadListAd_qq(BookListAdapter adapter, int adCnt, boolean addFooter) {
if(mAdManager==null) {
mAdManager = new NativeUnifiedAD(activity,
getAppID(Constants.AD_TENCENT_QQ),
Constants.AD_SETTING.getInformationFlow().getSlotId(Constants.AD_TENCENT_QQ),
this);
}
mAdManager.loadData(adCnt);
qqAdapter =adapter;
qqAddFooter=addFooter;
Log.d(TAG, "loadListAd_qq: ad requested");
}*/
private boolean qqAddFooter;
private BookListAdapter qqAdapter;
/* @Override
public void onADLoaded(List<NativeUnifiedADData> ads) {
Log.d(TAG, "loadListAd_qq: ad onADLoaded,qqAddFooter? "+qqAddFooter);
// mIsLoading = false;
// 防止在onDestory后网络回包
if(qqAdapter==null){
return;
}
if(qqAddFooter) {
qqAdapter.AddFooterItem(ads);
}else{
qqAdapter.AddHeaderItem(ads);
}
}*/
@Override
public void onNoAD(AdError adError) {
Log.d(TAG, "loadListAd_qq: ad onNoAD " );
Log.i(
TAG,
String.format("onNoAD, error code: %d, error msg: %s", adError.getErrorCode(),
adError.getErrorMsg()));
}
private NativeExpressAD mADManager;
void loadListAd_qq(BookListAdapter adapter, int adCnt, boolean addFooter) {
ADSize adSize = new ADSize(ADSize.FULL_WIDTH, ADSize.AUTO_HEIGHT); // 消息流中用AUTO_HEIGHT
mADManager = new NativeExpressAD(activity, adSize, getAppID(Constants.AD_TENCENT_QQ) ,
Constants.AD_SETTING.getInformationFlow().getSlotId(Constants.AD_TENCENT_QQ) , this);
mADManager.setMaxVideoDuration(5);
mADManager.loadAD(adCnt);
qqAdapter =adapter;
qqAddFooter=addFooter;
Log.d(TAG, "loadListAd_qq: ad requested");
}
@Override
public void onADLoaded(List<NativeExpressADView> adList) {
Log.i(TAG, "onADLoaded: " + adList.size());
/* mAdViewList = adList;
for (int i = 0; i < mAdViewList.size(); i++) {
int position = FIRST_AD_POSITION + ITEMS_PER_AD * i;
if (position < mNormalDataList.size()) {
NativeExpressADView view = mAdViewList.get(i);
GDTLogger.i("ad load[" + i + "]: " + getAdInfo(view));
if (view.getBoundData().getAdPatternType() == AdPatternType.NATIVE_VIDEO) {
view.setMediaListener(mediaListener);
}
mAdViewPositionMap.put(view, position); // 把每个广告在列表中位置记录下来
mAdapter.addADViewToPosition(position, mAdViewList.get(i));
}
}
mAdapter.notifyDataSetChanged();*/
if(qqAdapter==null){
return;
}
if(qqAddFooter) {
qqAdapter.AddFooterItem(adList);
}else{
qqAdapter.AddHeaderItem(adList);
}
}
@Override
public void onRenderFail(NativeExpressADView adView) {
Log.i(TAG, "onRenderFail: " + adView.toString());
}
@Override
public void onRenderSuccess(NativeExpressADView adView) {
// Log.i(TAG, "onRenderSuccess: " + adView.toString() + ", adInfo: " + getAdInfo(adView));
}
@Override
public void onADExposure(NativeExpressADView adView) {
Log.i(TAG, "onADExposure: " + adView.toString());
}
@Override
public void onADClicked(NativeExpressADView adView) {
Log.i(TAG, "onADClicked: " + adView.toString());
}
@Override
public void onADClosed(NativeExpressADView adView) {
Log.i(TAG, "onADClosed: " + adView.toString());
/* if (mAdapter != null) {
int removedPosition = mAdViewPositionMap.get(adView);
mAdapter.removeADView(removedPosition, adView);
}*/
}
@Override
public void onADLeftApplication(NativeExpressADView adView) {
Log.i(TAG, "onADLeftApplication: " + adView.toString());
}
@Override
public void onADOpenOverlay(NativeExpressADView adView) {
Log.i(TAG, "onADOpenOverlay: " + adView.toString());
}
@Override
public void onADCloseOverlay(NativeExpressADView adView) {
Log.i(TAG, "onADCloseOverlay");
}
//qq ad end<-------------
/**
* 加载 toutiao feed广告
*/
void loadListAd( BookListAdapter adapter, int adCnt, boolean addFooter) {
if(!Constants.AD_SETTING.isShowAdsense()){
return;
}
if(Constants.AD_SETTING.getInformationFlow().getSource()==Constants.AD_TENCENT_QQ) {
loadListAd_qq(adapter, adCnt, addFooter);
}else if(Constants.AD_SETTING.getInformationFlow().getSource()==Constants.AD_TOUTIAO){
activity.loadListAd_toutiao(adapter, adCnt, addFooter);
}
activity.loadListAd(adapter,adCnt,addFooter);
}
@Override

View File

@ -13,6 +13,7 @@ import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.text.TextUtils;
import android.util.Log;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@ -25,9 +26,9 @@ import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.androidquery.callback.AQuery2;
/*import com.androidquery.callback.AQuery2;
import com.novelbook.android.AD.toutiao.TTAdManagerHolder;
import com.novelbook.android.BuildConfig;
import com.novelbook.android.BuildConfig;*/
import com.novelbook.android.Main2Activity;
import com.novelbook.android.R;
import com.novelbook.android.db.Chapter;
@ -111,11 +112,11 @@ public class Fragment_Shelf extends BasicFragment {
,Fileutil.formatFileSize( LitePal.getDatabase().getMaximumSize())
));
try{
/* try{
throw new Exception("show trace");
}catch (Exception e){
Log.e(TAG, "loadNovelsOnShelf: ",e);
}
}*/
bookLists = Novel.getNovelsOnShelf();
noveIds = "";

View File

@ -1,7 +1,7 @@
package com.novelbook.android.Fragments;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
@ -12,22 +12,8 @@ import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;
import com.bytedance.sdk.openadsdk.AdSlot;
import com.bytedance.sdk.openadsdk.TTAdNative;
import com.bytedance.sdk.openadsdk.TTFeedAd;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.novelbook.android.AD.toutiao.TToast;
import com.novelbook.android.Activity_Search;
import com.novelbook.android.Activity_base;
import com.novelbook.android.BuildConfig;
import com.novelbook.android.Main2Activity;
import com.novelbook.android.R;
import com.novelbook.android.activity_cates;
import com.novelbook.android.adapter.BandanAdapterNew;
import com.novelbook.android.bean.NovelBlock;
import com.novelbook.android.db.Novel;
import com.novelbook.android.netsubscribe.BookSubscribe;
import com.novelbook.android.netutils.OnSuccessAndFaultListener;
@ -39,11 +25,9 @@ import com.novelbook.android.adapter.BookListAdapter;
import com.umeng.analytics.MobclickAgent;
import org.json.JSONObject;
import org.litepal.LitePal;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import butterknife.BindView;

View File

@ -98,7 +98,7 @@ public class Main2Activity extends Activity_base
// requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
config =Config.getInstance();
// ButterKnife.bind(this);
CommonUtil.checkPermission(this, Manifest.permission.INSTALL_PACKAGES, 1000, "下载更新需要此权限,请允许");
initialSexOption();
//checkUpdate(true);
CommonUtil.getSearchTabTtitle(this);
@ -432,6 +432,11 @@ private int bottomSelectedIndex;
return true;
}
if(isShelfZhengli){
udateShelfZhengli();
return true;
}
int cnt=0;
long secondTime = System.currentTimeMillis();
if (secondTime - firstTime > 800) {//如果两次按键时间间隔大于800毫秒则不退出

View File

@ -5,6 +5,7 @@ import android.graphics.Typeface;
import android.support.design.widget.AppBarLayout;
import android.support.v4.view.ViewPager;
import android.support.v7.widget.Toolbar;
import android.text.TextUtils;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Menu;
@ -103,8 +104,9 @@ TextView tvSource;
if (getSupportActionBar() != null) {
getSupportActionBar().setTitle(pageFactory.getBookName());
}
if(!TextUtils.isEmpty(pageFactory.getSite().getName())) {
tvSource.setText(String.format("以下目录及内容来自%s%s", pageFactory.getSite().getName(), Constants.SHOW_NOVEL_CHAPTER_URL ? pageFactory.getSite().getMuluUrl() : ""));
}
pager.setAdapter(new MyPagerAdapter(getSupportFragmentManager(),pageFactory.getNovle().getId()));
tabLayout.setViewPager(pager);
}

View File

@ -5,10 +5,10 @@ import android.app.Application;
import android.content.Context;
import android.provider.SyncStateContract;
import android.util.Log;
/*
import com.bytedance.sdk.openadsdk.TTAdConfig;
import com.bytedance.sdk.openadsdk.TTAdConstant;
import com.bytedance.sdk.openadsdk.TTAdSdk;
import com.bytedance.sdk.openadsdk.TTAdSdk;*/
import com.google.android.gms.ads.MobileAds;
import com.google.gson.Gson;
import com.novelbook.android.AD.toutiao.TTAdManagerHolder;
@ -71,7 +71,7 @@ public class MyApp extends Application {
initAD_AdMob();
}
private void initAD_ChuanShanJia(){
TTAdManagerHolder.init(applicationContext);
// TTAdManagerHolder.init(applicationContext);
}
private void initAD_AdMob(){
if(AdSetting.getAppID(Constants.AD_MOB).length()>0){
@ -92,15 +92,15 @@ public class MyApp extends Application {
/**
* 添加Activity
*/
public void addActivity_(Activity activity) {
public void addActivity_(Activity_base activity) {
// 判断当前集合中不存在该Activity
if (!oList.contains(activity)) {
oList.add(activity);//把当前Activity添加到集合中
}
currentAct=activity;
}
private static Activity currentAct =null;
public static Activity getCurrentActivity(){
private static Activity_base currentAct =null;
public static Activity_base getCurrentActivity(){
return currentAct;
}

View File

@ -43,7 +43,7 @@ import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;
import com.androidquery.callback.AQuery2;
/*import com.androidquery.callback.AQuery2;
import com.androidquery.callback.ImageOptions;
import com.bytedance.sdk.openadsdk.AdSlot;
import com.bytedance.sdk.openadsdk.TTAdConstant;
@ -52,7 +52,7 @@ import com.bytedance.sdk.openadsdk.TTAdNative;
import com.bytedance.sdk.openadsdk.TTAppDownloadListener;
import com.bytedance.sdk.openadsdk.TTBannerAd;
import com.bytedance.sdk.openadsdk.TTImage;
import com.bytedance.sdk.openadsdk.TTNativeAd;
import com.bytedance.sdk.openadsdk.TTNativeAd;*/
import com.novelbook.android.AD.SplashAdManager;
import com.novelbook.android.AD.toutiao.TTAdManagerHolder;
import com.novelbook.android.AD.toutiao.TToast;

View File

@ -19,16 +19,16 @@ import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
import com.androidquery.callback.AQuery2;
//import com.androidquery.callback.AQuery2;
import com.androidquery.callback.ImageOptions;
import com.bytedance.sdk.openadsdk.DownloadStatusController;
/*import com.bytedance.sdk.openadsdk.DownloadStatusController;
import com.bytedance.sdk.openadsdk.TTAdConstant;
import com.bytedance.sdk.openadsdk.TTAppDownloadListener;
import com.bytedance.sdk.openadsdk.TTFeedAd;
import com.bytedance.sdk.openadsdk.TTImage;
import com.bytedance.sdk.openadsdk.TTNativeAd;
import com.novelbook.android.AD.toutiao.TToast;
import com.novelbook.android.BookActivity;
import com.novelbook.android.BookActivity;*/
import com.novelbook.android.R;
import com.novelbook.android.db.Novel;
@ -106,8 +106,8 @@ public class BookListAdapter extends RecyclerView.Adapter< RecyclerView.ViewHol
this.percent = percent;
}
private AQuery2 mAQuery;
private Map<AdViewHolder, TTAppDownloadListener> mTTAppDownloadListenerMap = new WeakHashMap<>();
// private AQuery2 mAQuery;
// private Map<AdViewHolder, TTAppDownloadListener> mTTAppDownloadListenerMap = new WeakHashMap<>();
public void setShowFootView(boolean showFootView) {
this.showFootView = showFootView;
}
@ -116,7 +116,7 @@ public class BookListAdapter extends RecyclerView.Adapter< RecyclerView.ViewHol
mContext = context;
mInflater = LayoutInflater.from(mContext);
mDatas = datas;
this.mAQuery = new AQuery2(context);
// this.mAQuery = new AQuery2(context);
}
public BookListAdapter(Context context, List<Novel> mBooks, int listItemID, OnItemClickListener clickLitener) {
@ -125,7 +125,7 @@ public class BookListAdapter extends RecyclerView.Adapter< RecyclerView.ViewHol
this.mOnItemClickListener = clickLitener;
this.listItemID = listItemID;
mInflater = LayoutInflater.from(mContext);
this.mAQuery = new AQuery2(context);
// this.mAQuery = new AQuery2(context);
}
@ -133,7 +133,7 @@ public class BookListAdapter extends RecyclerView.Adapter< RecyclerView.ViewHol
public BookListAdapter(Context context, OnItemClickListener clickLitener) {
this.mContext = context;
this.mOnItemClickListener = clickLitener;
this.mAQuery = new AQuery2(context);
// this.mAQuery = new AQuery2(context);
}
public void setListener(OnItemClickListener clickLitener){
@ -150,7 +150,8 @@ public class BookListAdapter extends RecyclerView.Adapter< RecyclerView.ViewHol
//最后一个item设置为footerView
if (mDatas.get(position) instanceof Novel) {
return TYPE_ITEM;
} else if (mDatas.get(position) instanceof TTFeedAd) {
}
/* else if (mDatas.get(position) instanceof TTFeedAd) {
TTFeedAd ad = (TTFeedAd) mDatas.get(position);
Log.d(TAG, "getItemViewType: ad.getImageMode()= " +ad.getImageMode());
if (ad.getImageMode() == TTAdConstant.IMAGE_MODE_SMALL_IMG) {
@ -163,7 +164,8 @@ public class BookListAdapter extends RecyclerView.Adapter< RecyclerView.ViewHol
return ITEM_VIEW_TYPE_VIDEO;
}
return ITEM_VIEW_TYPE_SMALL_PIC_AD;
}else if(mDatas.get(position) instanceof NativeExpressADView ){
}*/
else if(mDatas.get(position) instanceof NativeExpressADView ){
return ITEM_VIEW_TYPE_QQ_NATIVE_EXPRESS;
}
Log.d(TAG, String.format("getItemViewType exception 1: position %s, mDatas.get(position) %s ,mDatas.size %s",position, mDatas.get(position),mDatas.size() ));
@ -232,7 +234,7 @@ public class BookListAdapter extends RecyclerView.Adapter< RecyclerView.ViewHol
@Override
public void onBindViewHolder(RecyclerView.ViewHolder hd, int position) {
TTFeedAd ttFeedAd;
// TTFeedAd ttFeedAd;
if (hd instanceof FooterViewHolder) {
@ -368,7 +370,8 @@ public class BookListAdapter extends RecyclerView.Adapter< RecyclerView.ViewHol
}
});
}
}else if (hd instanceof SmallAdViewHolder) {
}
/* else if (hd instanceof SmallAdViewHolder) {
ttFeedAd =(TTFeedAd) mDatas.get(position);
SmallAdViewHolder smallAdViewHolder = (SmallAdViewHolder) hd;
bindData(smallAdViewHolder, ttFeedAd);
@ -449,7 +452,7 @@ public class BookListAdapter extends RecyclerView.Adapter< RecyclerView.ViewHol
}
}
}
}*/
}
@Override
@ -501,10 +504,14 @@ public class BookListAdapter extends RecyclerView.Adapter< RecyclerView.ViewHol
}
}
public void AddHeaderItem(List items) {
if(mDatas.size()>3 &&( mDatas.get(3) instanceof TTFeedAd) ){
if(mDatas.size()>3 &&( mDatas.get(3) instanceof NativeExpressADView
/*|| mDatas.get(3) instanceof TTFeedAd*/) ){
return;
}
int p = mDatas.size()>3?3:0;
if( mDatas.get(p) instanceof NativeExpressADView){
return;
}
mDatas.addAll(p, items);
notifyDataSetChanged();
}
@ -666,7 +673,7 @@ public class BookListAdapter extends RecyclerView.Adapter< RecyclerView.ViewHol
}
}
/*
private void bindData(final AdViewHolder adViewHolder, TTFeedAd ad) {
//可以被点击的view, 也可以把convertView放进来意味item可被点击
List<View> clickViewList = new ArrayList<>();
@ -745,7 +752,7 @@ public class BookListAdapter extends RecyclerView.Adapter< RecyclerView.ViewHol
private void bindDownLoadStatusController(AdViewHolder adViewHolder, final TTFeedAd ad) {
final DownloadStatusController controller = ad.getDownloadStatusController();
/* adViewHolder.mStopButton.setOnClickListener(new View.OnClickListener() {
*//* adViewHolder.mStopButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (controller != null) {
@ -765,7 +772,7 @@ public class BookListAdapter extends RecyclerView.Adapter< RecyclerView.ViewHol
Log.d(TAG, "取消下载");
}
}
});*/
});*//*
}
private void bindDownloadListener(final Button adCreativeButton, final AdViewHolder adViewHolder, TTFeedAd ad) {
@ -842,6 +849,6 @@ public class BookListAdapter extends RecyclerView.Adapter< RecyclerView.ViewHol
//一个ViewHolder对应一个downloadListener, isValid判断当前ViewHolder绑定的listener是不是自己
ad.setDownloadListener(downloadListener); // 注册下载监听器
mTTAppDownloadListenerMap.put(adViewHolder, downloadListener);
}
}*/
}

View File

@ -7,6 +7,8 @@ import io.reactivex.Observable;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.FieldMap;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.Path;
@ -100,5 +102,8 @@ public interface HttpApi {
Observable<ResponseBody> getPaihangBangByCate(@Query("sex") int Sex,@Query("cid") int cid);
@GET("page/siterank")
Observable<ResponseBody> getPaihangBangList(@Query("sex") int Sex,@Query("cid") int cid,@Query("pn")int pageNo);
@FormUrlEncoded
@POST("r/{actionType}.shtml") //{action type}.shtml?msg=${msg}
Observable<ResponseBody> reportMsg(@Path("actionType")String actionType, @FieldMap Map<String, String> map);
}

View File

@ -1,6 +1,10 @@
package com.novelbook.android.netsubscribe;
import android.util.Log;
import com.novelbook.android.netutils.HttpMethods;
import com.novelbook.android.netutils.OnSuccessAndFaultListener;
import com.novelbook.android.netutils.OnSuccessAndFaultSub;
import java.util.HashMap;
import java.util.Map;
@ -8,8 +12,10 @@ import java.util.Map;
import io.reactivex.Observable;
import io.reactivex.observers.DisposableObserver;
import okhttp3.ResponseBody;
import retrofit2.http.Path;
public class BookSubscribe {
public final static String TAG = BookSubscribe.class.getSimpleName();
public static void getData(int pageNumber, int count, DisposableObserver<ResponseBody> subscriber) {
Map<String,Integer> map = new HashMap<>();
map.put("start",pageNumber);
@ -104,4 +110,25 @@ public class BookSubscribe {
Observable<ResponseBody> observable = HttpMethods.getInstance("page/siterank").getHttpApi().getPaihangBangList(sex,cid,pageNo);
HttpMethods.getInstance().toSubscribe(observable, subscriber);
}
public static void reportMsg(String actionType, String msg ){
Map<String,String> map = new HashMap<>();
map.put("msg",msg );
Observable<ResponseBody> observable = HttpMethods.getInstance("r/").getHttpApi().reportMsg( actionType, map);
Log.d( TAG,String.format("report actionType %s, msg %s",actionType,msg));
DisposableObserver<ResponseBody> subscriber = new OnSuccessAndFaultSub(new OnSuccessAndFaultListener() {
@Override
public void onSuccess(String result) {
Log.d( TAG,String.format("report result %s",result));
}
@Override
public void onFault(String errorMsg) {
Log.e( TAG,String.format("report error %s",errorMsg));
}
});
HttpMethods.getInstance().toSubscribe(observable, subscriber);
}
}

View File

@ -12,6 +12,7 @@ import android.util.Log;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.novelbook.android.AD.toutiao.TTAdManagerHolder;
import com.novelbook.android.Activity_base;
import com.novelbook.android.BookActivity;
import com.novelbook.android.BuildConfig;
import com.novelbook.android.Main2Activity;
@ -447,7 +448,7 @@ public class NetUtil {
}
public static void checkUpdate(boolean isSilence){
Activity currentActivity = MyApp.getCurrentActivity();
Activity_base currentActivity = MyApp.getCurrentActivity();
if(currentActivity==null){
return;
}

View File

@ -0,0 +1,63 @@
/*
* Copyright © Zhenjie Yan
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*//*
package com.novelbook.android.permision;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.text.TextUtils;
import com.novelbook.android.R;
*/
/*import com.yanzhenjie.permission.Permission;
import com.yanzhenjie.permission.Rationale;
import com.yanzhenjie.permission.RequestExecutor;*//*
import java.util.List;
*/
/**
* Created by Zhenjie Yan on 2018/1/1.
*//*
public final class RuntimeRationale implements Rationale<List<String>> {
@Override
public void showRationale(Context context, List<String> permissions, final RequestExecutor executor) {
List<String> permissionNames = Permission.transformText(context, permissions);
String message = context.getString(R.string.message_permission_rationale,
TextUtils.join("\n", permissionNames));
new AlertDialog.Builder(context).setCancelable(false)
.setTitle(R.string.title_dialog)
.setMessage(message)
.setPositiveButton(R.string.resume, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
executor.execute();
}
})
.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
executor.cancel();
}
})
.show();
}
}*/

View File

@ -34,6 +34,7 @@ import android.view.View;
import android.widget.ProgressBar;
import android.widget.Toast;
import com.novelbook.android.Activity_base;
import com.novelbook.android.BookActivity;
import com.novelbook.android.BuildConfig;
import com.novelbook.android.MyApp;
@ -71,7 +72,7 @@ public class UpdateManager {
private String mSavePath;
private int progress;
private boolean cancelUpdate = false;
private Activity mContext;
private Activity_base mContext;
private ProgressBar mProgress;
private Dialog mDownloadDialog;
private boolean isForceRefresh;
@ -98,7 +99,7 @@ public class UpdateManager {
};
};
public UpdateManager(Activity context)
public UpdateManager(Activity_base context)
{
this.mContext = context;
// app =(QiYouApplication)context;
@ -320,6 +321,7 @@ public class UpdateManager {
{
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
CommonUtil.checkPermission(mContext, Manifest.permission.WRITE_EXTERNAL_STORAGE, EXTERNAL_STORAGE_REQ_CODE, "下载更新需要此权限,请允许");
CommonUtil.checkPermission(mContext, Manifest.permission.INSTALL_PACKAGES, 1024, "下载更新需要此权限,请允许");
}
// 閺嬪嫰锟界<EFBFBD>纭呯樈濡楋拷
@ -357,6 +359,7 @@ public class UpdateManager {
}
});
Dialog noticeDialog = builder.create();
noticeDialog.setCancelable(false);
noticeDialog.show();
@ -390,7 +393,7 @@ public class UpdateManager {
}
});
mDownloadDialog = builder.create();
mDownloadDialog.setCancelable(false);
mDownloadDialog.setCancelable(true);
mDownloadDialog.show();
// 閻滄澘婀弬鍥
downloadApk();
@ -465,9 +468,16 @@ public class UpdateManager {
}
} catch (MalformedURLException e)
{
if(isForceRefresh){
exit(-1);
}
Log.e(TAG, "run: ", e);
} catch (IOException e)
{
mContext.checkAndRequestPermission();
if(isForceRefresh){
// exit(-1);
}
Log.e(TAG, "run: ", e);
}
// 閸欐牗绉锋稉瀣祰鐎电鐦藉鍡樻<EFBFBD>

View File

@ -15,6 +15,7 @@ import android.widget.TextView;
import android.widget.Toast;
import com.google.gson.Gson;
import com.novelbook.android.BuildConfig;
import com.novelbook.android.MyApp;
import com.novelbook.android.bean.Cache;
import com.novelbook.android.bean.NovelSites;
@ -32,6 +33,7 @@ import com.novelbook.android.netutils.OnSuccessAndFaultSub;
import org.json.JSONException;
import org.json.JSONObject;
import org.litepal.LitePal;
import org.litepal.util.Const;
import org.w3c.dom.Text;
import java.io.File;
@ -439,13 +441,30 @@ public class BookUtil {
}
void reportMsg(String reportType,String url,String content,String headers,String httpStatus){
String msg = String.format("{\"type\":%s, \"id\":%s ,\"name\":\"%s\",\"site\":\"%s\",\"url\":\"%s\",\"content\":\"%s\",\"requestHeader\":\"%s\",\"httpStatus\":\"%s\"}," ,
reportType ,mNovel.getId(),mNovel.getName(),mSite.getDomain(),url ,content,headers,httpStatus);
msg = String.format("{\"type\":%s, \"novelId\":%s ,\"site\":\"%s\",\"url\":\"%s\",\"httpStatus\":\"%s\",\"content\":\"%s\"}," ,
reportType ,mNovel.getNovelId(),mSite.getDomain(),url ,httpStatus,content);
BookSubscribe.reportMsg(reportType ,msg);
}
private void checkLastUpdatedChapter() {
if(BuildConfig.LOG_DEBUG) {
if(mChapters.size()>1) {
reportMsg(Constants.REPORT_NEW_UPDATE, mChapters.get(mChapters.size() - 1).getChapterUrl(), mNovel.getChapterName(), "", "");
}
}
for (int i=mChapters.size()-1;i>0;i--) {
if(mChapters.get(i).getChapterName().equals(mNovel.getChapterName())){
if(i<mChapters.size()-1){
mNovel.setChapterName(mChapters.get(mChapters.size()-1).getChapterName());
Log.d(TAG, "prepare book: set novel lastchaptname " + mNovel.getLastReadChapt());
reportMsg(Constants.REPORT_NEW_UPDATE,mChapters.get(mChapters.size()-1).getChapterUrl(),mNovel.getChapterName(),"","");
break;
}
}
@ -902,6 +921,7 @@ int muluRetryCount =0;
// mMuluStatus = MuluStatus.failed;
reportMsg( Constants.REPORT_REX_MULU_ERROR,url,"",getRequestHeader(request), "");
return;
}
@ -939,7 +959,9 @@ int muluRetryCount =0;
@Override
public void onResponse(Call call, Response response){
ResponseBody body = response.body();
if(BuildConfig.LOG_DEBUG) {
reportMsg( Constants.REPORT_REX_MULU_ERROR,url,"",getRequestHeader(request),response.code()+"");
}
if(response.code()!=200){
Log.d(TAG,String.format("prepare book loadChapts----failed, %s 目录 from %s,return code %s", mNovel.getName() ,url,response.code() ));
// handler.sendEmptyMessage(3);
@ -948,6 +970,9 @@ int muluRetryCount =0;
Log.d(TAG,String.format("prepare book loadChapts----failed, response code %s retrying count %s",response.code(), muluRetryCount ));
muluRetryCount++;
readChaptersAsync();
}else{
reportMsg( Constants.REPORT_REX_MULU_ERROR,url,"",getRequestHeader(request),response.code()+"");
}
return;
}
@ -1771,6 +1796,9 @@ private void loadChaptContent(final int chapterIndex) throws JSONException, Inte
siteJson.put("chapterContentRegex", mSiteRule.getChapterContentRegex());
siteJson.put("chapterContentDumpRegex", mSiteRule.getChapterContentDumpRegex());
Request request = getTagRequest(url, refUrl,-1);
HttpMethods.getOkClient().newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
@ -1815,14 +1843,31 @@ private void loadChaptContent(final int chapterIndex) throws JSONException, Inte
}*/
// String bodyStr = body.string();
// bodyStr =NovelParseUtil.enconding(bodyStr,mSiteRule.getEncoding());
// Log.d( TAG,String.format("prepare book content %s", body ));
String bodyStr =NovelParseUtil.enconding(body,mSiteRule.getEncoding());
if(TextUtils.isEmpty(bodyStr)){
Log.d( TAG,String.format("prepare book loadChaptContent %s isEmpty,retry....", index, Thread.currentThread().getName()));
chaptDownStatus.put(index,DownloadStatus.failure);
return;
}
// Log.d( TAG,String.format("prepare book encoded content %s", bodyStr ));
bodyStr = NovelParseUtil.getChapterContent(bodyStr, siteJson);
if(BuildConfig.LOG_DEBUG) {
reportMsg(Constants.REPORT_REX_CHAPTER_CONTENT_ERROR, mSite.getMuluUrl(),"",getRequestHeader(request),200+"");//TODO: remove
}
if(TextUtils.isEmpty(bodyStr) || bodyStr.trim().length()<10 ){
Log.d( TAG,String.format("prepare book loadChaptContent %s isEmpty,retry....", index, Thread.currentThread().getName()));
reportMsg(Constants.REPORT_REX_CHAPTER_CONTENT_ERROR, mSite.getMuluUrl(),bodyStr,getRequestHeader(request),200+"");
// bodyStr += Constants.BAD_CHAR +Constants.BAD_CHAR +"内容正在搜索中,请稍后刷新内容";
return;
}
String title = chapter.getChapterName();
String chapterContent = title+ "\n" + NovelParseUtil.getChapterContent(bodyStr, siteJson);
String chapterContent = title+ "\n" + bodyStr;
char[] buf = chapterContent.toCharArray();
File file = new File(fileChapterName(index));
file.createNewFile();
@ -1898,26 +1943,30 @@ private void loadChaptContent(final int chapterIndex) throws JSONException, Inte
builder.removeHeader("User-Agent").addHeader("User-Agent", HttpMethods.USERAGENT);
}
// .header( "Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8")
// .header( "Upgrade-Insecure-Requests", "1")
// .header("content-type", "text/html; charset=utf-8")
// .header("Content-Type", "text/plain; charset=utf-8")
// .header( "Accept", "*/*")
;
/* if(mSiteRule!=null && !TextUtils.isEmpty(mSiteRule.getEncoding()) ){
builder.header("Accept-Encoding",mSiteRule.getEncoding());
}
*/
if (maxAge > 0) {
builder.header("Cache-Control", "public, max-age=" + maxAge);
}
return builder.build();
}
private String getRequestHeader(Request request) {
String head = String.format("\"Referer\":\"%s\",\"User-Agent\":\"%s\",\"Cache-Control\":\"%s\"",
request.header("Referer"),request.header("User-Agent"), request.header("Cache-Control")
);
for (int i = 0; i < mSiteRule.getHeaders().length; i += 2) {
head += String.format(",\"%s\":\"%s\"",mSiteRule.getHeaders()[i], mSiteRule.getHeaders()[i + 1]) ;
}
return "{" + head +"}";
}
public boolean isChapterTitle(String line){
return (line.length() <= 30 && (line.matches(".*第.{1,8}章.*") || line.matches(".*第.{1,8}节.*"))) ;

View File

@ -1,13 +1,18 @@
package com.novelbook.android.utils;
import android.Manifest;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.graphics.Point;
import android.net.Uri;
import android.os.Build;
import android.provider.Settings;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v4.widget.ContentLoadingProgressBar;
@ -27,6 +32,7 @@ import android.widget.Toast;
import com.novelbook.android.netsubscribe.BookSubscribe;
import com.novelbook.android.netutils.OnSuccessAndFaultListener;
import com.novelbook.android.netutils.OnSuccessAndFaultSub;
//import com.yanzhenjie.permission.AndPermission;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
@ -338,6 +344,7 @@ public class CommonUtil {
return 0;
}
}
public static int getVersionCodeLong(Context context) {
if(Constants.version >0){
return Constants.version;
@ -345,7 +352,9 @@ public class CommonUtil {
try {
PackageManager manager = context.getPackageManager();
PackageInfo info = manager.getPackageInfo(context.getPackageName(), 0);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
Constants.version = (int) info.getLongVersionCode();
}else return getVersionCode(context);
} catch (Exception e) {
e.printStackTrace();
return 0;
@ -525,10 +534,20 @@ public class CommonUtil {
}
public static void checkPermission (Activity thisActivity, String permission, int requestCode, String errorText) {
//判断当前Activity是否已经获得了该权限
if(ContextCompat.checkSelfPermission(thisActivity,permission) != PackageManager.PERMISSION_GRANTED) {
boolean hasPermision =true;
try{
hasPermision = ContextCompat.checkSelfPermission(thisActivity,permission) == PackageManager.PERMISSION_GRANTED;
}catch (Exception e){
}
Log.e(TAG, String.format("checkAndRequestPermission: %s 有权限? ",hasPermision) );
if(!hasPermision) {
Log.e(TAG, String.format("checkAndRequestPermission: %s 曾经被用户拒绝过? %s",permission,ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
permission)) );
//如果App的权限申请曾经被用户拒绝过就需要在这里跟用户做出解释
if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
permission)) {
Toast.makeText(thisActivity,errorText,Toast.LENGTH_SHORT).show();
//进行权限请求
ActivityCompat.requestPermissions(thisActivity,
@ -536,15 +555,61 @@ public class CommonUtil {
requestCode);
} else {
//进行权限请求
ActivityCompat.requestPermissions(thisActivity,
new String[]{permission},
requestCode);
Log.e(TAG, String.format("checkAndRequestPermission: %s start requestperimisions ",permission ) );
// startAppSettingActivity(thisActivity);
ActivityCompat.requestPermissions(thisActivity, new String[]{permission}, requestCode);
}
} else {
}
}
private static boolean isSDK2API23() {
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M;
}
private static boolean isHavePermission(Context context, String permission) {
return PackageManager.PERMISSION_GRANTED == ContextCompat.checkSelfPermission(context, permission);
}
private static boolean isUserNoShowPermissionDialig(Activity activity, String permission) {
return !(ActivityCompat.shouldShowRequestPermissionRationale(activity, permission));
}
private static void startAppSettingActivity(Activity activity) {
Intent intent = new Intent();
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.parse("package:" + activity.getPackageName()));
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
activity.startActivityForResult(intent, 100);
}
/*private void requestPermission(Activity thisActivity,String permission) {
AndPermission.with(thisActivity).runtime()
.permission(permission)
// 准备方法 okhttp 的拦截器一样在请求权限之前先运行改方法已经拥有权限不会触发该方法
.rationale((context, permissions, executor) -> {
// 此处可以选择显示提示弹窗
executor.execute();
})
// 用户给权限了
// 用户拒绝权限包括不再显示权限弹窗也在此列
.onDenied(permissions -> {
// 判断用户是不是不再显示权限弹窗了若不再显示的话进入权限设置页
if (AndPermission.hasAlwaysDeniedPermission(thisActivity, permissions)) {
// 打开权限设置页
// AndPermission.with(thisActivity).permissionSetting(thisActivity).execute();
return;
}
})
.start();
}*/
public static void getSearchTabTtitle(Context context){
BookSubscribe.getSearchTitles(Constants.SEX,new OnSuccessAndFaultSub(new OnSuccessAndFaultListener() {

View File

@ -209,7 +209,7 @@ public class Config {
//String defaultHost =CommonUtil.getMeta(MyApp.applicationContext,"MAINHOST");
String defaultHost = BuildConfig.MAIN_HOST;
String rt =sp.getString(KEY_ROOT_URL,defaultHost);
// String rt =sp.getString(KEY_ROOT_URL,defaultHost);
return sp.getString(KEY_ROOT_URL,defaultHost);
}

View File

@ -18,8 +18,9 @@ public class Constants {
public static AdSetting AD_SETTING;
public static final int AD_TENCENT_QQ =1;
public static final int AD_TOUTIAO =2;
public static final int AD_MOB =3;
public static final int AD_MOB =2;
public static final int AD_TOUTIAO =3;
public static final int AD_BANNER_TOP =1;
public static final int AD_BANNER_BOTTOM =2;
@ -75,5 +76,11 @@ public class Constants {
public final static int MAX_SLEEP_4_CHAPT_DOWNLOAD =10000;//最多等待时间10s
public final static int MAX_SHELF_CNT =100;
public static final String REPORT_NEW_UPDATE ="HasNewUpdate"; //其它源有新章节
public static final String REPORT_REX_CHAPTER_CONTENT_ERROR ="EmptyText";//章节内容解析错误
public static final String REPORT_REX_MULU_ERROR ="NovelNotFound";//目录获取错误 或书不存在
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

View File

@ -38,6 +38,7 @@
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_margin="16dp"
android:layout_marginTop="20dp"
android:background="@drawable/background_circle"
android:gravity="center"
android:text="@string/click_to_skip"

View File

@ -41,7 +41,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/llTitle"
android:src="@drawable/toutiao_splash_banner"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
@ -60,12 +60,16 @@
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
tools:ignore="UseCompoundDrawables">
<!-- <ImageView
android:id="@+id/img_native_dislike"
android:layout_width="20dp"
android:layout_height="20dp"
android:background="@drawable/tt_dislike_icon" />-->
<ImageView
android:id="@+id/img_native_dislike"
android:layout_width="20dp"
android:layout_height="20dp"
android:background="@drawable/tt_dislike_icon" />
/>
<TextView
android:layout_weight="0"

View File

@ -10,7 +10,7 @@
android:id="@+id/tablayout"
android:layout_width="80dp"
android:layout_height="match_parent"
android:background="#EDEDED"
android:background="@color/colorPrimaryLight"
app:indicator_color="#FFFFFF"
app:indicator_gravity="fill"
app:tab_height="50dp"

View File

@ -2,8 +2,11 @@
<resources>
<color name="colorPrimary">#FF7F50</color>
<color name="colorPrimaryDark">#FF6347</color>
<color name="colorPrimaryLight">#FFFAFA</color><!--雪白色 -->
<color name="colorPrimary3">#008577</color>
<color name="colorPrimaryDark3">#00574B</color>
<color name="colorAccent">#D81B60</color>
<color name="black">#000000</color>
<color name="gray">#000000</color>

View File

@ -1,5 +1,5 @@
<resources>
<string name="app_name">网书助手(测试)</string>
<string name="app_name">网书助手</string>
<string name="title_home">书架</string>
<string name="title_dashboard">书城</string>
<string name="title_notifications">排行榜</string>
@ -132,7 +132,7 @@
<string name="refresh">重试</string>
<string name="soft_update_no">已是最新版本</string>
<string name="soft_update_title">有新版本了</string>
<string name="soft_force_update_title">强制更新</string>
<string name="soft_force_update_title">您版本太低,请升级版本</string>
<string name="soft_update_info">更新日志</string>
<string name="soft_update_updatebtn">更新</string>
<string name="soft_update_later">以后再说</string>
@ -153,6 +153,15 @@
<string name="gdtslogan">gdtslogan</string>
<string name="click_to_skip">点击跳过</string>
<string name="noCache">没有缓存</string>
<!--<string name="successfully">成功</string>-->
<string name="permision_successfully">授权成功</string>
<string name="permision_failure">授权失败</string>
<string name="title_dialog">说明</string>
<string name="message_permission_rationale">Grant the following permissions to continue the program:\n\n%1$s</string>
<string name="setting">设置</string>
<string name="resume">继续</string>
<string name="cancel">取消</string>
<string name="message_permission_always_failed">Please give us permission in the settings:\n\n%1$s</string>
<string name="message_setting_comeback">The user comes back from the settings page.</string>
</resources>

View File

@ -17,7 +17,8 @@
<option name="ALLOW_USER_CONFIGURATION" value="false" />
<option name="MANIFEST_FILE_RELATIVE_PATH" value="/src/main/AndroidManifest.xml" />
<option name="RES_FOLDER_RELATIVE_PATH" value="/src/main/res" />
<option name="RES_FOLDERS_RELATIVE_PATH" value="file://$MODULE_DIR$/src/main/res" />
<option name="RES_FOLDERS_RELATIVE_PATH" value="file://$MODULE_DIR$/src/main/res;file://$MODULE_DIR$/src/debug/res;file://$MODULE_DIR$/build/generated/res/resValues/debug" />
<option name="TEST_RES_FOLDERS_RELATIVE_PATH" value="" />
<option name="ASSETS_FOLDER_RELATIVE_PATH" value="/src/main/assets" />
</configuration>
</facet>
@ -92,6 +93,7 @@
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/bundle_manifest" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/check_manifest_result" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/compatible_screen_manifest" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/duplicate_classes_check" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental-runtime-classes" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental-verifier" />
@ -102,32 +104,33 @@
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/instant_run_merged_manifests" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/instant_run_split_apk_resources" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/javac" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/jniLibs" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/legacy_multidex_aapt_derived_proguard_rules" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/legacy_multidex_main_dex_list" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/lint_jar" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/manifest-checker" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/merged_assets" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/merged_jni_libs" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/merged_manifests" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/merged_shaders" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/metadata_feature_manifest" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/prebuild" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/processed_res" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/reload-dex" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/res" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/resources" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/rs" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/shader_assets" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/shaders" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/signing_config" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/split-apk" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/symbols" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/tmp" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/transforms" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/validate_signing_config" />
<excludeFolder url="file://$MODULE_DIR$/build/outputs" />
<excludeFolder url="file://$MODULE_DIR$/build/tmp" />
</content>
<orderEntry type="jdk" jdkName="Android API 28 Platform" jdkType="Android SDK" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="Gradle: com.google.android.gms:play-services-ads-identifier:16.0.0@aar" level="project" />
<orderEntry type="library" name="Gradle: :open_ad_sdk:@aar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:localbroadcastmanager:28.0.0@aar" level="project" />
<orderEntry type="library" name="Gradle: __local_aars__:E.\reading\android\asProjects\zhuike\libs\juniversalchardet-1.0.3.jar:unspecified@jar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:loader:28.0.0@aar" level="project" />
@ -191,7 +194,6 @@
<orderEntry type="library" scope="TEST" name="Gradle: com.squareup:javawriter:2.1.1@jar" level="project" />
<orderEntry type="library" name="Gradle: com.squareup.okio:okio:1.17.2@jar" level="project" />
<orderEntry type="library" name="Gradle: __local_aars__:E.\reading\android\asProjects\zhuike\libs\android-query-full.0.26.7.jar:unspecified@jar" level="project" />
<orderEntry type="library" name="Gradle: q.rorbin:badgeview:1.1.2@aar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:cardview-v7:28.0.0@aar" level="project" />
<orderEntry type="library" name="Gradle: com.google.android.gms:play-services-audience:16.0.0@aar" level="project" />
<orderEntry type="library" name="Gradle: com.astuetz:pagerslidingtabstrip:1.0.1@aar" level="project" />