打开系统通知设置

This commit is contained in:
renhaoting 2025-11-28 14:47:21 +08:00
parent cfe4acbb78
commit 8b37a63a4a
8 changed files with 378 additions and 3 deletions

View File

@ -3,6 +3,7 @@
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<application <application
android:name=".VidiDinApp" android:name=".VidiDinApp"

View File

@ -1,6 +1,8 @@
package com.gamedog.vididin package com.gamedog.vididin
object VidiConst { object VidiConst {
const val URL_DISCORD: String = "https://www.baidu.com"
/** /**
* 描述网络常量 * 描述网络常量
* *

View File

@ -1,5 +1,6 @@
package com.gamedog.vididin.main.fragments package com.gamedog.vididin.main.fragments
import android.Manifest
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.ViewGroup import android.view.ViewGroup
import androidx.core.view.ViewCompat import androidx.core.view.ViewCompat
@ -9,11 +10,14 @@ import androidx.fragment.app.viewModels
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.ama.core.architecture.appBase.AppViewsFragment import com.ama.core.architecture.appBase.AppViewsFragment
import com.ama.core.architecture.appBase.OnFragmentBackgroundListener import com.ama.core.architecture.appBase.OnFragmentBackgroundListener
import com.ama.core.architecture.util.AndroidUtil
import com.ama.core.architecture.util.ResUtil import com.ama.core.architecture.util.ResUtil
import com.ama.core.architecture.util.eventbus.NotifyMan import com.ama.core.architecture.util.eventbus.NotifyMan
import com.ama.core.architecture.util.permission.PermissionUtil
import com.ama.core.architecture.util.setOnClickBatch import com.ama.core.architecture.util.setOnClickBatch
import com.ama.core.architecture.util.setStatusBarDarkFont import com.ama.core.architecture.util.setStatusBarDarkFont
import com.gamedog.vididin.R import com.gamedog.vididin.R
import com.gamedog.vididin.VidiConst
import com.gamedog.vididin.VididinEvents import com.gamedog.vididin.VididinEvents
import com.gamedog.vididin.core.login.login.AccountManager import com.gamedog.vididin.core.login.login.AccountManager
import com.gamedog.vididin.main.WatchVideoDialog import com.gamedog.vididin.main.WatchVideoDialog
@ -56,7 +60,8 @@ class TasksFragment : AppViewsFragment<ViewBinding, UiState, ViewModel>(), OnTab
override fun ViewBinding.initViews() { override fun ViewBinding.initViews() {
with(binding) { with(binding) {
setOnClickBatch(ivGotoDailySign, llTaskBenefit, llTaskWatchVideo, llTaskGame, llTaskZerobuy, tvWatchVideo, tvWithdraw) { setOnClickBatch(ivGotoDailySign, llTaskBenefit, llTaskWatchVideo, llTaskGame,
llTaskZerobuy, tvWatchVideo, tvWithdraw) {
when(this) { when(this) {
ivGotoDailySign->{ ivGotoDailySign->{
DailySignDialog(requireActivity()).show() DailySignDialog(requireActivity()).show()
@ -211,11 +216,21 @@ class TasksFragment : AppViewsFragment<ViewBinding, UiState, ViewModel>(), OnTab
} }
private fun gotoDiscord() { private fun gotoDiscord() {
//TODO("Not yet implemented") AndroidUtil.openUrl(VidiConst.URL_DISCORD)
} }
private fun gotoNotification() { private fun gotoNotification() {
//TODO("Not yet implemented") PermissionUtil.checkPermission(Manifest.permission.POST_NOTIFICATIONS, object : PermissionUtil.ICallback() {
override fun onAllGranted() {
AndroidUtil.openAppNotifySettings()
}
override fun onPartialGranted() {
}
override fun onAllRejected() {
}
})
} }
private fun gotoWithVideo() { private fun gotoWithVideo() {

View File

@ -3,6 +3,8 @@
xmlns:tools="http://schemas.android.com/tools"> xmlns:tools="http://schemas.android.com/tools">
<application> <application>
<activity android:name=".util.permission.PermissionActivity" android:exported="false" />
<provider <provider
android:name="androidx.startup.InitializationProvider" android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup" android:authorities="${applicationId}.androidx-startup"
@ -13,4 +15,6 @@
android:value="androidx.startup" /> android:value="androidx.startup" />
</provider> </provider>
</application> </application>
</manifest> </manifest>

View File

@ -1,9 +1,17 @@
package com.ama.core.architecture.util package com.ama.core.architecture.util
import android.app.Activity
import android.content.Intent
import android.content.Intent.FLAG_ACTIVITY_NEW_TASK
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.provider.Settings
import android.widget.Toast import android.widget.Toast
import com.ama.core.architecture.BaseApp import com.ama.core.architecture.BaseApp
import kotlin.random.Random import kotlin.random.Random
class AndroidUtil private constructor() { class AndroidUtil private constructor() {
companion object { companion object {
@ -22,8 +30,47 @@ class AndroidUtil private constructor() {
Toast.makeText(BaseApp.appContext(), str, Toast.LENGTH_SHORT).show() Toast.makeText(BaseApp.appContext(), str, Toast.LENGTH_SHORT).show()
} }
fun openUrl(url: String) {
val appContext = BaseApp.appContext()
val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
intent.flags = FLAG_ACTIVITY_NEW_TASK
if (intent.resolveActivity(appContext.packageManager) != null) {
appContext.startActivity(intent)
} else {
Toast.makeText(appContext, "No available browser", Toast.LENGTH_SHORT).show()
}
}
fun openAppNotifySettings() {
val context = BaseApp.appContext()
val intent = Intent()
intent.flags = FLAG_ACTIVITY_NEW_TASK
try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { // Android >=8
intent.action = Settings.ACTION_APP_NOTIFICATION_SETTINGS
intent.putExtra(Settings.EXTRA_APP_PACKAGE, context.packageName)
intent.putExtra(Settings.EXTRA_CHANNEL_ID, context.applicationInfo.uid)
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { // Android 5.0-7.1
intent.action = "android.settings.APP_NOTIFICATION_SETTINGS"
intent.putExtra("app_package", context.packageName)
intent.putExtra("app_uid", context.applicationInfo.uid)
}
context.startActivity(intent)
} catch (e: Exception) {
e.printStackTrace()
val fallbackIntent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
fallbackIntent.data = Uri.fromParts("package", context.packageName, null)
context.startActivity(fallbackIntent)
}
}
} }
} }

View File

@ -0,0 +1,218 @@
package com.ama.core.architecture.util.permission;
import static com.ama.core.architecture.util.permission.PermissionUtil.PERMISSION_BROADCAST_ACTION;
import static com.ama.core.architecture.util.permission.PermissionUtil.PERMISSION_BROADCAST_ACTION_EXTRA_RESULT;
import static com.ama.core.architecture.util.permission.PermissionUtil.PERMISSION_BROADCAST_ACTION_EXTRA_UUID;
import android.app.Activity;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import com.ama.core.architecture.R;
import com.ama.core.architecture.util.ResUtil;
import java.util.ArrayList;
public class PermissionActivity extends AppCompatActivity {
public static final int PERMISSION_REQUEST_CODE = 1000;
private static final String PERMISSION_TOTAL_REJECTED_HINT = ResUtil.INSTANCE.getString(R.string.permission_hint);
public static final String EXTRA_PERMISSION = "extra_permission";
public static final String EXTRA_ACTION_UUID = "extra_callback";
private String mActionUUID;
private ArrayList<String> mPermissionList;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStatusBarColor(this, Color.TRANSPARENT);
setNavigationBarColor(this, Color.TRANSPARENT);
mActionUUID = getIntent().getStringExtra(EXTRA_ACTION_UUID);
mPermissionList = getIntent().getStringArrayListExtra(EXTRA_PERMISSION);
startRequest();
}
private void startRequest() {
if (mActionUUID == null || mPermissionList == null && mPermissionList.size() <= 0) {
finish();
}
ActivityCompat.requestPermissions(PermissionActivity.this,
mPermissionList.toArray(new String[mPermissionList.size()]), PERMISSION_REQUEST_CODE);
}
@Override
public void onRequestPermissionsResult(int requestCode,
@NonNull String[] permissions,
@NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (PERMISSION_REQUEST_CODE == requestCode) {
if (grantResults == null || grantResults.length <= 0) {
sendResultBroadCast(PermissionUtil.PERMISSION_RESULT_ALL_REJECTED);
} else {
int grantedCount = 0;
int unGrantedCount = 0;
for (int result : grantResults) {
if (result == PackageManager.PERMISSION_GRANTED) {
grantedCount++;
} else {
unGrantedCount++;
}
}
if (unGrantedCount <= 0) {
sendResultBroadCast(PermissionUtil.PERMISSION_RESULT_ALL_GRANTED);
} else {
int finalGrantedCount = grantedCount;
StringBuilder unGrantedPermissionsStr = new StringBuilder();
for (int i=0; i<permissions.length; i++) {
if (grantResults[i] != PackageManager.PERMISSION_GRANTED
&& permissions[i].contains(".")
&& !permissions[i].endsWith(".")) {
unGrantedPermissionsStr.append("[" + permissions[i].substring(permissions[i].lastIndexOf(".") + 1) + "] ");
}
}
new AlertDialog.Builder(this)
.setTitle("权限已被拒绝")
.setMessage(PERMISSION_TOTAL_REJECTED_HINT + unGrantedPermissionsStr)
.setPositiveButton("系统设置", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Uri packageURI = Uri.parse("package:" + getPackageName());
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, packageURI);
startActivity(intent);
sendResultBroadCast(finalGrantedCount > 0 ? PermissionUtil.PERMISSION_RESULT_PARTIAL_GRANTED : PermissionUtil.PERMISSION_RESULT_ALL_REJECTED);
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
sendResultBroadCast(finalGrantedCount > 0 ? PermissionUtil.PERMISSION_RESULT_PARTIAL_GRANTED : PermissionUtil.PERMISSION_RESULT_ALL_REJECTED);
}
})
.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
sendResultBroadCast(finalGrantedCount > 0 ? PermissionUtil.PERMISSION_RESULT_PARTIAL_GRANTED : PermissionUtil.PERMISSION_RESULT_ALL_REJECTED);
}
})
.create()
.show();
}
}
}
}
/**
* 用户选择了"不再询问", 引导用户跳转系统设置
*/
private void showJump2SystemSettingDialog() {
// new
new AlertDialog.Builder(this)
.setTitle("权限已被拒绝")
.setMessage(mPermissionList + PERMISSION_TOTAL_REJECTED_HINT)
.setPositiveButton("系统设置", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Uri packageURI = Uri.parse("package:" + getPackageName());
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, packageURI);
startActivity(intent);
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
})
.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
}
})
.create()
.show();
}
private void sendResultBroadCast(int permissionResult) {
Intent intent = new Intent(PERMISSION_BROADCAST_ACTION);
intent.putExtra(PERMISSION_BROADCAST_ACTION_EXTRA_RESULT, permissionResult);
intent.putExtra(PERMISSION_BROADCAST_ACTION_EXTRA_UUID, mActionUUID);
LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(intent);
finish();
}
//******************************** Static Methods *********************************//
private static void setStatusBarColor(Activity activity, int colorId) {
Window window = activity.getWindow();
window.setStatusBarColor(colorId);
}
private static void setNavigationBarColor(Activity activity, int colorId) {
Window window = activity.getWindow();
window.setNavigationBarColor(colorId);
}
private static void setTranslucentStatus(Window window) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
View decorView = window.getDecorView();
int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
decorView.setSystemUiVisibility(option);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(Color.TRANSPARENT);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
WindowManager.LayoutParams attributes = window.getAttributes();
int flagTranslucentStatus = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
attributes.flags |= flagTranslucentStatus;
window.setAttributes(attributes);
}
}
}

View File

@ -0,0 +1,87 @@
package com.ama.core.architecture.util.permission;
import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.text.TextUtils;
import androidx.annotation.NonNull;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import com.ama.core.architecture.BaseApp;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.UUID;
public class PermissionUtil {
public static final int PERMISSION_RESULT_ALL_GRANTED = 1;
public static final int PERMISSION_RESULT_PARTIAL_GRANTED = 2;
public static final int PERMISSION_RESULT_ALL_REJECTED = 3;
public static final String PERMISSION_BROADCAST_ACTION = "permission_broadcast_action";
public static final String PERMISSION_BROADCAST_ACTION_EXTRA_UUID = "permission_broadcast_action_extra_uuid";
public static final String PERMISSION_BROADCAST_ACTION_EXTRA_RESULT = "permission_broadcast_action_extra_result";
public static abstract class ICallback implements Serializable {
public abstract void onAllGranted();
public abstract void onPartialGranted();
public abstract void onAllRejected();
}
public static void checkPermission(@NonNull String permission,
@NonNull ICallback callback) {
if (!TextUtils.isEmpty(permission)) {
checkPermission(new String[]{permission}, callback);
}
}
public static void checkPermission(@NonNull String[] permissionArr,
@NonNull ICallback callback) {
if (permissionArr == null || permissionArr.length == 0) {
callback.onAllGranted();
return;
}
String actionUUID = UUID.randomUUID().toString();
regisBroadcast(actionUUID, callback);
Intent intent = new Intent(BaseApp.Companion.appContext(), PermissionActivity.class);
intent.setFlags(FLAG_ACTIVITY_NEW_TASK);
intent.putExtra(PermissionActivity.EXTRA_ACTION_UUID, actionUUID);
intent.putStringArrayListExtra(PermissionActivity.EXTRA_PERMISSION, new ArrayList<String>(Arrays.asList(permissionArr)));
BaseApp.Companion.appContext().startActivity(intent);
}
private static void regisBroadcast(String actionUUID, ICallback callback) {
LocalBroadcastManager broadcastManager = LocalBroadcastManager.getInstance(BaseApp.Companion.appContext());
broadcastManager.registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String resultActionUUID = intent.getStringExtra(PERMISSION_BROADCAST_ACTION_EXTRA_UUID);
int permissionResult = intent.getIntExtra(PERMISSION_BROADCAST_ACTION_EXTRA_RESULT, PERMISSION_RESULT_ALL_REJECTED);
broadcastManager.unregisterReceiver(this);
if (callback != null && actionUUID.equalsIgnoreCase(resultActionUUID)) {
switch (permissionResult) {
case PERMISSION_RESULT_ALL_GRANTED:
callback.onAllGranted();
break;
case PERMISSION_RESULT_PARTIAL_GRANTED:
callback.onPartialGranted();
break;
case PERMISSION_RESULT_ALL_REJECTED:
callback.onAllRejected();
break;
}
}
}
}, new IntentFilter(PERMISSION_BROADCAST_ACTION));
}
}

View File

@ -6,4 +6,5 @@
<string name="state_error_network_timeout" tools:ignore="ResourceName">The request timed out. Please try again later.</string> <string name="state_error_network_timeout" tools:ignore="ResourceName">The request timed out. Please try again later.</string>
<string name="state_error_network_unknown_host" tools:ignore="ResourceName">Unable to connect to server. Please check network connection.</string> <string name="state_error_network_unknown_host" tools:ignore="ResourceName">Unable to connect to server. Please check network connection.</string>
<string name="state_error_network_unknown_exception" tools:ignore="ResourceName">Unknown Exception: %1$s</string> <string name="state_error_network_unknown_exception" tools:ignore="ResourceName">Unknown Exception: %1$s</string>
<string name="permission_hint">You have to enable the permissions, or the system can\'t works\\n</string>
</resources> </resources>