Index: /branches/ag_client_motionpro_android_3.1.4/motionpro_android/app/build.gradle
===================================================================
--- /branches/ag_client_motionpro_android_3.1.4/motionpro_android/app/build.gradle	(revision 8459)
+++ /branches/ag_client_motionpro_android_3.1.4/motionpro_android/app/build.gradle	(working copy)
@@ -14,7 +14,7 @@
         minSdk 24
         //noinspection EditedTargetSdkVersion
         targetSdk 33
-        versionCode 84
+        versionCode 85
         versionName "v3.1.4"
         setProperty("archivesBaseName", "MotionProGlobal-" + versionName + "-" + (new Date().format('yyyyMMddHH')))
         /**
Index: /branches/ag_client_motionpro_android_3.1.4/motionpro_android/app/src/main/AndroidManifest.xml
===================================================================
--- /branches/ag_client_motionpro_android_3.1.4/motionpro_android/app/src/main/AndroidManifest.xml	(revision 8459)
+++ /branches/ag_client_motionpro_android_3.1.4/motionpro_android/app/src/main/AndroidManifest.xml	(working copy)
@@ -33,10 +33,19 @@
      Modify: fix Bug 243, when click download complete notification, open device download folder
      -->
     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
-        android:maxSdkVersion="32" />
+        tools:ignore="ScopedStorage" />
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
-        android:maxSdkVersion="32"
         tools:ignore="ScopedStorage" /> <!-- dangerous -->
+
+    <!--
+     Author: Yunting
+     Date: 240115
+     Modify: fix Bug 512, Android 13 device is unable to access the READ_EXTERNAL_STORAGE and WRITE_EXTERNAL_STORAGE permissions
+    -->
+    <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
+    <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
+    <uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
+
     <uses-permission android:name="android.permission.VIBRATE" />
     <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
     <!-- uses-permission android:name="android.permission.READ_LOGS" / -->
Index: /branches/ag_client_motionpro_android_3.1.4/motionpro_android/app/src/main/java/net/arraynetworks/mobilenow/browser/AddCertActivity.java
===================================================================
--- /branches/ag_client_motionpro_android_3.1.4/motionpro_android/app/src/main/java/net/arraynetworks/mobilenow/browser/AddCertActivity.java	(revision 8454)
+++ /branches/ag_client_motionpro_android_3.1.4/motionpro_android/app/src/main/java/net/arraynetworks/mobilenow/browser/AddCertActivity.java	(working copy)
@@ -134,6 +134,9 @@
                  * Author: Yunting
                  * Date: 230906
                  * Modify: fix Bug 81, change for GooglePlay store, comment code is for Huawei App Store
+                 *
+                 * Date: 240115
+                 * Modify: fix Bug 512, when sdk version >= 33, ask for read media permission
                  * */
                 /*ActivityCompat.requestPermissions(AddCertActivity.this, new String[] {Manifest.permission.WRITE_EXTERNAL_STORAGE}, RequestPermissions.REQUEST_WRITE_EXTERNAL_PERMISSION);
                 requestPermissions.setCallback((CommonCallback) (s, i) -> {
@@ -155,23 +158,52 @@
                     }
                 });*/
 
-                if (!(ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)){
-                    requestPermissions.requestWriteExternalPermission();
-                    mBtnInstall.postDelayed(() -> mBtnInstall.setTag(Boolean.TRUE), 500);
-                } else {
-                    if (AsyncTask.Status.RUNNING != mDownloadTask.getStatus()) {
-                        mDownloadTask = new AddCertActivity.DownloadCertFile();
-                        String url = mUrl.getText().toString().trim();
-                        if (!url.equals("") && !url.contains("://")) {
-                            url = "http://" + url;
+                String[] mediaPermissions = new String[0];
+                if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.TIRAMISU) {
+                    mediaPermissions = new String[]{
+                            Manifest.permission.READ_MEDIA_IMAGES,
+                            Manifest.permission.READ_MEDIA_VIDEO,
+                            Manifest.permission.READ_MEDIA_AUDIO
+                    };
+                }
+
+                boolean allMediaPermissionsGranted = true;
+
+                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
+                    for (String permission : mediaPermissions) {
+                        if (!(ContextCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_GRANTED)) {
+                            allMediaPermissionsGranted = false;
+                            requestPermissions.requestReadMediaPermission();
+                            break;
                         }
-                        SharedPreferences.Editor editor = mPrefs.edit();
-                        editor.putString(CERT_URL, url);
-                        editor.apply();
-                        mDownloadTask.execute(url);
                     }
+
+                    if (allMediaPermissionsGranted)
+                        handleDownloadTask();
+                }else {
+                    if (!(ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)){
+                        requestPermissions.requestWriteExternalPermission();
+                        mBtnInstall.postDelayed(() -> mBtnInstall.setTag(Boolean.TRUE), 500);
+                    } else
+                        handleDownloadTask();
                 }
+
+                mBtnInstall.postDelayed(() -> mBtnInstall.setTag(Boolean.TRUE), 500);
+            }
+        }
+    }
+
+    private void handleDownloadTask() {
+        if (AsyncTask.Status.RUNNING != mDownloadTask.getStatus()) {
+            mDownloadTask = new AddCertActivity.DownloadCertFile();
+            String url = mUrl.getText().toString().trim();
+            if (!url.equals("") && !url.contains("://")) {
+                url = "http://" + url;
             }
+            SharedPreferences.Editor editor = mPrefs.edit();
+            editor.putString(CERT_URL, url);
+            editor.apply();
+            mDownloadTask.execute(url);
         }
     }
 
Index: /branches/ag_client_motionpro_android_3.1.4/motionpro_android/app/src/main/java/net/arraynetworks/mobilenow/util/RequestPermissions.java
===================================================================
--- /branches/ag_client_motionpro_android_3.1.4/motionpro_android/app/src/main/java/net/arraynetworks/mobilenow/util/RequestPermissions.java	(revision 8454)
+++ /branches/ag_client_motionpro_android_3.1.4/motionpro_android/app/src/main/java/net/arraynetworks/mobilenow/util/RequestPermissions.java	(working copy)
@@ -37,6 +37,12 @@
 	public final static int MY_PERMISSIONS_REQUEST_NOTIFICATIONS = 4;
 	/**
 	 * Author: Yunting
+	 * Date: 240115
+	 * Modify: fix Bug 512, add type for android.permission.READ_MEDIA_IMAGES, READ_MEDIA_VIDEO, READ_MEDIA_AUDIO permission
+	 * */
+	public final static int REQUEST_READ_MEDIA_PERMISSION = 5;
+	/**
+	 * Author: Yunting
 	 * Date: 230906
 	 * Modify: fix Bug 81, change for GooglePlay store, comment code is for Huawei App Store
 	 * */
@@ -71,15 +77,35 @@
 		return ContextCompat.checkSelfPermission(mActivity,
 				Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED;
 	}
+
+	/**
+	 * Author: Yunting
+	 * Date: 240115
+	 * Modify: fix Bug 512, when sdk version >= 33, ask for read media permission
+	 * */
+	@RequiresApi(api = Build.VERSION_CODES.TIRAMISU)
+	private boolean has_READ_MEDIA_PERMISSION() {
+		int readImagesPermission = ContextCompat.checkSelfPermission(mActivity, Manifest.permission.READ_MEDIA_IMAGES);
+		int readVideoPermission = ContextCompat.checkSelfPermission(mActivity, Manifest.permission.READ_MEDIA_VIDEO);
+		int readAudioPermission = ContextCompat.checkSelfPermission(mActivity, Manifest.permission.READ_MEDIA_AUDIO);
+
+		return readImagesPermission == PackageManager.PERMISSION_GRANTED &&
+				readVideoPermission == PackageManager.PERMISSION_GRANTED &&
+				readAudioPermission == PackageManager.PERMISSION_GRANTED;
+	}
 	
 	public boolean allPermissionsGranted() {
 		/**
 		 * Author: Yunting
 		 * Date: 231003
 		 * Modify: fix Bug 278, when sdk version >= 33, ask for notification permission
+		 *
+		 * Author: Yunting
+		 * Date: 240115
+		 * Modify: fix Bug 512, when sdk version >= 33, ask for read media permission
 		 * */
 		if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
-			return has_READ_PHONE_STATE() && has_WRITE_EXTERNAL_STORAGE() && has_POST_NOTIFICATION();
+			return has_READ_PHONE_STATE() && has_WRITE_EXTERNAL_STORAGE() && has_READ_MEDIA_PERMISSION() && has_POST_NOTIFICATION();
 		} else {
 			return has_READ_PHONE_STATE() && has_WRITE_EXTERNAL_STORAGE();
 		}
@@ -94,12 +120,19 @@
 		 * Author: Yunting
 		 * Date: 231003
 		 * Modify: fix Bug 278, when sdk version >= 33, ask for notification permission
+		 *
+		 * Author: Yunting
+		 * Date: 240115
+		 * Modify: fix Bug 512, when sdk version >= 33, ask for read media permission
 		 * */
 		if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
-			if ((!has_READ_PHONE_STATE()) || (!has_WRITE_EXTERNAL_STORAGE()) || (!has_POST_NOTIFICATION())) {
+			if ((!has_READ_PHONE_STATE()) || (!has_WRITE_EXTERNAL_STORAGE()) || (!has_READ_MEDIA_PERMISSION()) || (!has_POST_NOTIFICATION())) {
 				ActivityCompat.requestPermissions(mActivity, new String[] {
 								Manifest.permission.READ_PHONE_STATE,
 								Manifest.permission.WRITE_EXTERNAL_STORAGE,
+								Manifest.permission.READ_MEDIA_IMAGES,
+								Manifest.permission.READ_MEDIA_VIDEO,
+								Manifest.permission.READ_MEDIA_AUDIO,
 								Manifest.permission.POST_NOTIFICATIONS},
 						MY_PERMISSIONS_REQUEST_PERMISSIONS);
 				return false;
@@ -125,6 +158,24 @@
 		return true;
 	}
 
+	/**
+	 * Author: Yunting
+	 * Date: 240115
+	 * Modify: fix Bug 512, when sdk version >= 33, ask for read media permission
+	 * */
+	@RequiresApi(api = Build.VERSION_CODES.TIRAMISU)
+	public boolean requestReadMediaPermission(){
+		if (!has_READ_MEDIA_PERMISSION()) {
+			ActivityCompat.requestPermissions(mActivity, new String[] {
+							Manifest.permission.READ_MEDIA_IMAGES,
+							Manifest.permission.READ_MEDIA_VIDEO,
+							Manifest.permission.READ_MEDIA_AUDIO},
+					REQUEST_READ_MEDIA_PERMISSION);
+			return false;
+		}
+		return true;
+	}
+
 	public void onRequestPermissionsResult(int requestCode,
 			String permissions[], int[] grantResults) {
 		boolean granted = false;
@@ -163,6 +214,7 @@
 							mActivity.getString(R.string.permission_write_deny_info),mActivity.getString(R.string.ok),null);
 				}
 				break;
+
 		// other 'case' lines to check for other
 		// permissions this app might request
 
@@ -181,6 +233,21 @@
 				}
 				break;
 			}
+
+			/**
+			 * Author: Yunting
+			 * Date: 240115
+			 * Modify: fix Bug 512, case for read media type
+			 * */
+			case REQUEST_READ_MEDIA_PERMISSION:
+				if (granted) {
+					if(callback!=null) callback.result("", CommonConstant.COMMON_CONSTANT_SUCCESS);
+				} else {
+					if(callback!=null) callback.result("", CommonConstant.COMMON_CONSTANT_ERROR);
+					DialogUtils.getInstence().oneBtnDialog(mActivity,mActivity.getString(R.string.privacy_agreement_tip_title),
+							mActivity.getString(R.string.permission_write_deny_info),mActivity.getString(R.string.ok),null);
+				}
+				break;
 		}
 	}
 
