現在是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 singing.
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/271186.html
標籤:Android
上一篇:初識Android
