現在是2021-03-12 00::39
剛剛完成了一個小軟件部分功能,現在把出現的問題總結如下:
一、首先要下載jar包
網址:https://mvnrepository.com/artifact/net.sourceforge.jexcelapi/jxl/2.6.12
把jar包添加到項目庫
然后需要在清單文件配置申請訪問SD卡的權限信息
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:node="replace"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" tools:node="replace"/>
android:requestLegacyExternalStorage="true"
這里我出現了一個問題
這個版本的jxl只可以支持解析后綴名為:.xls的文件,而且有一點要特別注意,文件格式的修改最好通過文件另存為的方式修改,
而不要直接在文件名上修改后綴名
這樣看起來是對的,其實文件內部結構已經被打亂。那么在調用方法
in=new File(fileName);
Workbook workbook = Workbook.getWorkbook(in); 的時候就會出現文件解析異常,這個錯誤不會在控制台輸出,是很隱蔽的錯誤。
二、軟件錯誤調試
當出現那種運行不報錯,數據沒有NULL異常的情況時,
可以使用一條語句進行分析,
使用Log.v()方法在控制台輸出一句話。
這樣就可以知道程序究竟在運行到哪一步出現了問題,導致結果
不是自己想要的。
三、清單文件
清單文件盡量少亂改動,注釋也盡量少加,因為一旦出現哪個地方多了個什么符號是很難發現的,而且軟件不會飄紅報錯。
四、獲取權限可以有代碼來體現
前提是已經導入jar包並且在清單文件完成引用注冊
1 //讀寫權限
2 private static String[] PERMISSIONS_STORAGE = { 3 Manifest.permission.READ_EXTERNAL_STORAGE, 4 Manifest.permission.WRITE_EXTERNAL_STORAGE}; 5 //請求狀態碼
6 private static int REQUEST_PERMISSION_CODE = 1; 7
8 //寫在onCreate()
9 if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) { 10 if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { 11 ActivityCompat.requestPermissions(this, PERMISSIONS_STORAGE, REQUEST_PERMISSION_CODE); 12 } 13 } 14 //這是一個回調方法,在第一次運行安裝軟件的時候會在控制台輸出一句話 15
16 //回調訪問權限
17 @Override 18 public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 19 super.onRequestPermissionsResult(requestCode, permissions, grantResults); 20 if (requestCode == REQUEST_PERMISSION_CODE) { 21 for (int i = 0; i < permissions.length; i++) { 22 Log.i("MainActivity", "申請的權限為:" + permissions[i] + ",申請結果:" + grantResults[i]); 23 } 24 } 25 }
五、說一下實現過程中的路徑存儲問題
因為要獲取的是手機存儲位置,所以可能不如電腦那么清晰,我的手機是榮耀。
首先我們要清楚一點,就是
File file =
new File(Environment.getExternalStoragePublicDirectory(Environment.
DIRECTORY_DOWNLOADS), "success_0.xls");//參數2是文件名稱
下面給出幾種方法獲取路徑
tips:一般手機sd卡路徑是 /storage/emulated/0
① 獲取 /storage/emulated/0
1 public static boolean sdCardIsAvailable() { 2 //首先判斷外部存儲是否可用
3 if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { 4 File sd = new File(Environment.getExternalStorageDirectory().getPath()); 5 Log.e("qq", "sd = " + sd);//sd = /storage/emulated/0
6 return sd.canWrite(); 7 } else { 8 return false; 9 }
② 獲取 /storage/emulated/0(類似上面)
1 public String getSDPath() { 2 File sdDir = null; 3 //判斷sd卡是否存在
4 boolean sdCardExist = Environment.getExternalStorageState() 5 .equals(android.os.Environment.MEDIA_MOUNTED); 6 if (sdCardExist) { 7 sdDir = Environment.getExternalStorageDirectory();//獲取根目錄
8 Log.e("qq", "外部存儲可用..." + sdDir.toString()); 9 } 10 return sdDir.toString(); 11 } 12 //使用
13 private void saveInRoot() { 14 if (getSDPath()!=null) { 15 //String fileName = getSDPath() + "/"; 16 //File file = new File(fileName,"123111");//參數 17 //if (!file.mkdir()) { 18 //Toast.makeText(ExternalStoreActivity.this, "目錄已存在...", Toast.LENGTH_SHORT).show(); 19 //} else { 20 //Toast.makeText(ExternalStoreActivity.this, "創建新目錄...", Toast.LENGTH_SHORT).show(); 21 //}
22 } 23 }
③獲取手機指定目錄(也是我用的這一種)
1 public File getAlbumStorageDir(String fileName) { 2 // Get the directory for the user's public pictures directory. 3 //在 Environment.DIRECTORY_DOWNLOADS 目錄下創建名為fileName的文件夾 刷新查看
4 File file =
5 new File(Environment.getExternalStoragePublicDirectory(Environment. 6 DIRECTORY_DOWNLOADS), fileName);//參數2是文件名稱 7 //mkdirs()可以創建多級目錄 8 //mkdir()只能創建一級目錄
9 if (!file.mkdir()) { 10 Log.e(LOG_TAG, "Directory not created"); 11 Toast.makeText(ExternalStoreActivity.this, "目錄已存在...", Toast.LENGTH_SHORT).show(); 12 } else { 13 Toast.makeText(ExternalStoreActivity.this, "創建新目錄...", Toast.LENGTH_SHORT).show(); 14 } 15 return file; 16 }
上述代碼來自腳本之家 https://www.jb51.net/article/144850.htm
Tomorrow the birds will sing.
