diff --git a/studio-android/LightNovelLibrary/app/src/main/AndroidManifest.xml b/studio-android/LightNovelLibrary/app/src/main/AndroidManifest.xml index 610aa38..d2792c9 100644 --- a/studio-android/LightNovelLibrary/app/src/main/AndroidManifest.xml +++ b/studio-android/LightNovelLibrary/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + diff --git a/studio-android/LightNovelLibrary/app/src/main/java/org/mewx/wenku8/activity/MainActivity.java b/studio-android/LightNovelLibrary/app/src/main/java/org/mewx/wenku8/activity/MainActivity.java index dd8971d..5b4bc71 100644 --- a/studio-android/LightNovelLibrary/app/src/main/java/org/mewx/wenku8/activity/MainActivity.java +++ b/studio-android/LightNovelLibrary/app/src/main/java/org/mewx/wenku8/activity/MainActivity.java @@ -1,11 +1,16 @@ package org.mewx.wenku8.activity; +import static android.provider.Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION; + import android.Manifest; import android.content.Intent; import android.content.pm.PackageManager; import android.content.res.Configuration; +import android.net.Uri; import android.os.Build; import android.os.Bundle; +import android.os.Environment; +import android.util.Log; import android.view.Menu; import android.widget.Toast; @@ -15,10 +20,13 @@ import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentTransaction; +import com.afollestad.materialdialogs.MaterialDialog; +import com.afollestad.materialdialogs.Theme; import com.nostra13.universalimageloader.core.ImageLoader; import com.umeng.analytics.MobclickAgent; import com.umeng.commonsdk.UMConfigure; +import org.mewx.wenku8.BuildConfig; import org.mewx.wenku8.MyApp; import org.mewx.wenku8.R; import org.mewx.wenku8.async.CheckAppNewVersion; @@ -37,8 +45,10 @@ public class MainActivity extends BaseMaterialActivity { + // Below request codes can be any value. private static final int REQUEST_WRITE_EXTERNAL = 100; private static final int REQUEST_READ_EXTERNAL = 101; + private static final int APP_STORAGE_ACCESS_REQUEST_CODE = 501; private static final AtomicBoolean NEW_VERSION_CHECKED = new AtomicBoolean(false); @@ -77,19 +87,30 @@ private void initialApp() { Locale.setDefault(locale); getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics()); - // request write permission (112 write permission) - boolean hasPermission = (ContextCompat.checkSelfPermission(this, - Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED); - if (!hasPermission) { - ActivityCompat.requestPermissions(this, - new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_WRITE_EXTERNAL); - } - - // request read permission - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { - hasPermission = (ContextCompat.checkSelfPermission(this, - Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED); - if (!hasPermission) { + // Requests storage RW permissions (112 write permission). + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && !Environment.isExternalStorageManager()) { + // Shows a dialog to confirm requesting for the permission. + new MaterialDialog.Builder(MainActivity.this) + .theme(Theme.LIGHT) + .onPositive((ignored1, ignored2) -> { + Intent intent = new Intent(ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION, Uri.parse("package:" + BuildConfig.APPLICATION_ID)); + startActivityForResult(intent, APP_STORAGE_ACCESS_REQUEST_CODE); + }) + .onNegative((ignored1, ignored2) -> { + Toast.makeText(this, getResources().getText(R.string.missing_permission), Toast.LENGTH_LONG).show(); + }) + .content(R.string.dialog_content_ask_for_storage_permission) + .positiveText(R.string.dialog_positive_ok) + .negativeText(R.string.dialog_negative_preferno) + .show(); + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { + // Write permission. + if (missingPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)) { + ActivityCompat.requestPermissions(this, + new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_WRITE_EXTERNAL); + } + // Read permission. + if (missingPermission(Manifest.permission.READ_EXTERNAL_STORAGE)) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_READ_EXTERNAL); } @@ -233,25 +254,35 @@ protected void onResume() { } } + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && requestCode == APP_STORAGE_ACCESS_REQUEST_CODE) { + // Note that the result Code could either be OK or CANCELLED. + if (Environment.isExternalStorageManager()) { + // Permission granted. + reloadApp(); + } else { + Toast.makeText(this, getResources().getText(R.string.missing_permission), Toast.LENGTH_LONG).show(); + } + } + } + @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); switch (requestCode) { case REQUEST_WRITE_EXTERNAL: - case REQUEST_READ_EXTERNAL: { - if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { - //reload my activity with permission granted or use the features what required the permission - Intent i = getBaseContext().getPackageManager().getLaunchIntentForPackage(getBaseContext().getPackageName()); - if (i != null) { - i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); - startActivity(i); + case REQUEST_READ_EXTERNAL: + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) { + if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + reloadApp(); + } else { + Toast.makeText(this, getResources().getText(R.string.missing_permission), Toast.LENGTH_LONG).show(); } - } else { - Toast.makeText(this, getResources().getText(R.string.missing_permission), Toast.LENGTH_LONG).show(); } - } + break; } - } @Override @@ -283,4 +314,17 @@ public void run() { } } + private boolean missingPermission(String permissionName) { + return ContextCompat.checkSelfPermission(this, permissionName) != PackageManager.PERMISSION_GRANTED; + } + + private void reloadApp() { + //reload my activity with permission granted or use the features what required the permission + Intent i = getBaseContext().getPackageManager().getLaunchIntentForPackage(getBaseContext().getPackageName()); + if (i != null) { + i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + startActivity(i); + } + } + } diff --git a/studio-android/LightNovelLibrary/app/src/main/res/values-zh-rHK/strings.xml b/studio-android/LightNovelLibrary/app/src/main/res/values-zh-rHK/strings.xml index 6f2c93e..ccb22ab 100644 --- a/studio-android/LightNovelLibrary/app/src/main/res/values-zh-rHK/strings.xml +++ b/studio-android/LightNovelLibrary/app/src/main/res/values-zh-rHK/strings.xml @@ -240,5 +240,6 @@ 註意 您正在使用MewX提供的第三方中繼服務,點擊查看詳情。 已啟用第三方Wenku8中繼服務,由於以下的可能原因:\n登錄過期,請重新登錄;\n手機網絡異常,試試瀏覽器訪問;\n運營商劫持(部分地區的10086);\nWIFI切換到數據需等待域名解析緩存刷新(約10min);\n服務器暫時無法響應請求;\n此時段請求服務器次數過多。\n\n該中繼服務列表服務由mewx.org提供,與wenku8無關。另外,此列表數據僅供海外用戶使用,並可能滯後網站24小時以上。請勿在中國大陸使用,否則後果自負,望悉知。 - QQ交流群: 427577610 + QQ交流群: 181789084 + 由於曆史原因,app需要冩入存儲目錄下的wenku8文件夾,是否授予冩入權限? diff --git a/studio-android/LightNovelLibrary/app/src/main/res/values-zh-rTW/strings.xml b/studio-android/LightNovelLibrary/app/src/main/res/values-zh-rTW/strings.xml index 6f2c93e..ccb22ab 100644 --- a/studio-android/LightNovelLibrary/app/src/main/res/values-zh-rTW/strings.xml +++ b/studio-android/LightNovelLibrary/app/src/main/res/values-zh-rTW/strings.xml @@ -240,5 +240,6 @@ 註意 您正在使用MewX提供的第三方中繼服務,點擊查看詳情。 已啟用第三方Wenku8中繼服務,由於以下的可能原因:\n登錄過期,請重新登錄;\n手機網絡異常,試試瀏覽器訪問;\n運營商劫持(部分地區的10086);\nWIFI切換到數據需等待域名解析緩存刷新(約10min);\n服務器暫時無法響應請求;\n此時段請求服務器次數過多。\n\n該中繼服務列表服務由mewx.org提供,與wenku8無關。另外,此列表數據僅供海外用戶使用,並可能滯後網站24小時以上。請勿在中國大陸使用,否則後果自負,望悉知。 - QQ交流群: 427577610 + QQ交流群: 181789084 + 由於曆史原因,app需要冩入存儲目錄下的wenku8文件夾,是否授予冩入權限? diff --git a/studio-android/LightNovelLibrary/app/src/main/res/values/strings.xml b/studio-android/LightNovelLibrary/app/src/main/res/values/strings.xml index 233d2ff..a675adc 100644 --- a/studio-android/LightNovelLibrary/app/src/main/res/values/strings.xml +++ b/studio-android/LightNovelLibrary/app/src/main/res/values/strings.xml @@ -112,6 +112,7 @@ 停止加载 点击重新加载 没有结果 + 由于历史原因,app需要写入存储目录下的wenku8文件夹,是否授予写入权限? 选择执行的下载操作: 选择执行的删除操作: 输入保存的文件名(不要加.jpg) @@ -240,5 +241,5 @@ 帖子太久远,无法回复 您正在使用MewX提供的第三方中继服务,点击查看详情。 已启用第三方Wenku8中继服务,由于以下的可能原因:\n登录过期,请重新登录;\n手机网络异常,试试浏览器访问;\n运营商劫持(部分地区的10086);\nWIFI切换到数据需等待域名解析缓存刷新(约10min);\n服务器暂时无法响应请求;\n此时段请求服务器次数过多。\n\n该中继服务列表服务由mewx.org提供,与wenku8无关。另外,此列表数据仅供海外用户使用,并可能滞后网站24小时以上。请勿在中国大陆使用,否则后果自负,望悉知。 - QQ交流群: 427577610 + QQ交流群: 181789084