2018年12月31日 星期一

[Android]錯誤訊息:Didn't find class "org.apache.http.ProtocolVersion"


問題描述:在跑android的地圖會無法執行並顯示以下錯誤訊息



解決辦法:要在manifest加上以下這行
android:name="org.apache.http.legacy" android:required="false"/>

這個網頁有討論這個問題
https://issuetracker.google.com/issues/79478779

它的意思是,如果沒有用到apache http library就設定不讓它回傳避免error
in app manifest. However app does not use the apache http library, so it should be not be required

修改後就可以執行了

2018年12月23日 星期日

word表格空格打勾、打叉


word主畫面
插入 > 符號 > 其他符號 > Wingdings 2


調整一下畫面就可以找到空格打勾


2018年12月8日 星期六

android GPS定位常駐(程式碼)

也許是之前我用GPS程式碼是效率較低的方式,因此重新研究GPS的程式,如果有原理之類的說明也寫在這邊,如果有測試結果也寫在這邊。

使用requestLocationUpdates可以在GPS座標有移動時進行更新,而且只要短短的幾行程式就能辦到,不用寫timer之類的東西,這是2.X版就有的功能,這裡再測試整理如下,可以直接放在主頁面,以下是程式碼:




這裡是宣告全域變數,不宣告全域變數或許比較好,現在先這麼寫。gpsON這個變數也是先放在這邊,這是因為這個程式在關閉時還是會執行gps,另一種方式是在程式關閉時同時關閉gps,也是先用這個方式處理,有時間再訂正

 private double locationX = 0.0;
 private double locationY  = 0.0;
 boolean gpsON = false;
 LocationManager mlocationManager;



這段程式放在onCreate。其中requestLocationUpdates函式的3000=3秒,0是最小單位長度,一般是愈小愈準,但也會比較耗電。

 mlocationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
 Criteria criteria = new Criteria();
 criteria.setAccuracy(Criteria.ACCURACY_COARSE);
 criteria.setAltitudeRequired(false);
 criteria.setBearingRequired(false);
 criteria.setCostAllowed(false);//設置允許產生資費
 criteria.setPowerRequirement(Criteria.POWER_LOW);
 String provider = mlocationManager.getBestProvider(criteria, false);
 Location location = mlocationManager.getLastKnownLocation(provider);
 updateLocation(location);
 mlocationManager.requestLocationUpdates(provider, 3000, 0, locationListener);
 gpsON = true;



217/03/16:
紅色的部份建議在6.0以上的版本要這麼寫:

//詢問是否存取位置資訊
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
        && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

    ActivityCompat.requestPermissions(
            this,
            new String[] {
                    Manifest.permission.ACCESS_FINE_LOCATION,
                    Manifest.permission.ACCESS_COARSE_LOCATION}, 1
    );
}else{
    Location location = mlocationManager.getLastKnownLocation(provider);
    updateLocation(location);
    mlocationManager.requestLocationUpdates(provider, 3000, 0, locationListener);
}



放在副程式的區段,這邊除了updateLocation副程式,
上面的requestLocationUpdates會在固定時間找gps,
如果位置有變動就會執行onLocationChanged
在程式執行的時候會透過toast顯示現在方位,偵測到移動之後會顯示新的地點數據

 private void updateLocation(Location location) {
 if (location != null) {
 locationX = location.getLatitude();
 locationY  = location.getLongitude();
 } else {
 locationX = 0.0;
 locationY = 0.0;
 }
 //背景執行時關閉顯示地點
 if(gpsON == true){
 Toast.makeText(MainActivity.this, "" + "x:" + locationX  + " y:" + locationY , Toast.LENGTH_SHORT).show();
 }
 }
 private final LocationListener locationListener = new LocationListener() {
 public void onLocationChanged(Location location) {
 updateLocation(location);

 }
 public void onProviderDisabled(String provider){
 updateLocation(null);
 }
 public void onProviderEnabled(String provider){

 }
 public void onStatusChanged(String provider, int status,Bundle extras){

 }
 };

最後記得要在AndroidManifest.xml加上下面的程式碼,主要是GPS和network
基本上這就足夠了,
基餘的都是多加上去的









以上是android的GPS程式碼的大概內容,主要是寫給自己看的,比較容易找到資料。

2018年11月10日 星期六

[Android]sharedPreferences範例(改良版)


因為有時會用到就放這邊參考
public void SavePref(String keyname, String value) {
    SharedPreferences sharedPreferences = getPreferences(MainActivity.MODE_PRIVATE);    SharedPreferences.Editor editor = sharedPreferences.edit();    editor.putString(keyname, value);    editor.commit();}
public String GetPref(String keyname) {
    SharedPreferences sharedPreferences = getPreferences(MainActivity.MODE_PRIVATE);    return sharedPreferences.getString(keyname, "");}

SavePref("02","111111");
SavePref("02","222222");
SavePref("02","333333");
Log.d("---------", GetPref("01"));
Log.d("---------", GetPref("02"));
執行結果,02的值是可以取代的

[Android]記錄ListView點選位置




//記錄ListView點選位置private void saveListViewPositionAndTop() {
    firstVisiblePosition = lv.getFirstVisiblePosition();    View item = lv.getChildAt(0);    firstVisiblePositionTop = (item == null) ? 0 : item.getTop();}

// 恢复现在ListView的位置,(上一次保存的位置)
lv.setSelectionFromTop(firstVisiblePosition, firstVisiblePositionTop);


使用方式:
1、在onItemClick加這個:
saveListViewPositionAndTop();
2、在setAdapter加上setSelectionFromTop
lv.setAdapter(adapter);lv.setSelectionFromTop(firstVisiblePosition, firstVisiblePositionTop);

[JAVA]千分位符號


//測試千分符號int tempa = 100000;int tempb = 10000;NumberFormat numberFormat1 = NumberFormat.getNumberInstance();Log.d("---------",numberFormat1.format(tempa));Log.d("---------",numberFormat1.format(tempb));

輸出畫面

2018年11月3日 星期六

Visual studio發行web網頁


Visual studio發行web網頁
有幾個特點:

1、產生出來的檔案不會有後台(vb)原始檔
2、產生的檔案無後台vb程式碼,以bin底下的dll檔代替,功能和原本的網頁相同



這是發行前的檔案架構,可以看到aspx有vb檔



流程如下:
建置 > 發布web應用程式,或者右鍵發布web應用程式
進到發行web頁面



設定檔:發行目標,選取自訂

在連線這個項目
發行方法選「檔案系統」
並且選擇想要產出目標檔的位置



設定這個項目,檔案發行選項的前二項打勾



最後選取發行,就會在目標路徑找到產生出來的檔案


可以看到產生出來的檔案和原始檔不同,一是沒有像app_code相關資料夾,二是沒有vb檔,由bin的dll檔提升了安全性,功能與原本相同,是可以run的網頁檔。







2018年8月24日 星期五

無法讀取設定區段,因為它缺少區段宣告

無法讀取設定區段,因為它缺少區段宣告




處理方式:把framework2.0改成4.0

2018年4月1日 星期日

APP三種開發方式的比較





1.Native APP
原生 App 執行速度快,效能佳
原生 App 對硬體裝置的支援度較好
可以在官方線上商店上架


2.Web APP

Web App 不需要支付官方開發者年費,也不需要至官方應用程式商店上架、審核或讓官方抽成。 Web App 有任何功能更新,只需要在後端網站主機修改即可,使用者不需要重新下載安裝,就可以隨時使用最新的功能。

Web App 執行速度沒有原生應用程式來的快
Web App 對硬體裝置的支援度不好,許多硬體上的功能可能無法使用。例如:相機功能、 GPS 地理定位、測速計、磁力計、陀螺儀 … 等。


3.Hybrid APP
一般以 WEB APP 方式開發用戶端程式,但最後可在包裝後像 原生 APP 一樣上架至應用程式商店
前端操作介面可使用統一的網頁技術來做
可以同時享用原生碼與web開發的優點,缺點是不同平台要重新編譯,還有就是效能可能仍不及原生app




整理自:
https://read01.com/EBdK40.html

2018年3月31日 星期六



取得 app 版本資訊

PackageInfo pkgInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
verCode = pkgInfo.versionCode;
verName = pkgInfo.versionName;

一般使用者從應用程式資訊查詢到版本的資訊是上圖的versionName,它是字串格式。
至於versionCode是只有開發人員才看得到的資訊,這個數據為上架時要填入的數值



2018年3月4日 星期日

sql暫存資料表


1到3是建立資料表 -> 新增一筆資料 ->查詢資料表

--1、新增暫存資料表
Create Table #TempTable(
id int,
px float,
py float
)

--2、新增一筆資料
INSERT INTO #TempTable (id, px, py )
 VALUES (2, 121.11, 25.1)

--3、查詢內容
select * from #TempTable



執行結果:



刪除資料表、確認已刪除該暫存資料表

--4、刪除暫存資料表
IF Object_id('tempdb..#TempTable') IS NOT NULL
BEGIN
      DROP TABLE #TempTable
END

--5、查詢內容
select * from #TempTable


執行結果:

android錯誤處理Unknown failure (at android.os.Binder.execTransact(Binder.java:674))


錯誤訊息
Unknown failure (at android.os.Binder.execTransact(Binder.java:674))
圖片如下圖,據說出現的行數不一定相同,也有565行的情況在執行的時候出現以下的錯誤





參考資料
https://www.jianshu.com/p/73bbf7e151a4
這據說是用安卓7.1以後的版本會出現的error,我的情況是換了不同的主機發生上述錯誤訊息


處理方式
在file > setting > Insert Run > 取消"enable Insert Run to swap code/resource changes on deplay(default enabled)"

在下圖取消第一項(黃色標示處)


中文翻釋:啟用插入運行來交換deplay上的代碼/資源更改
有些不了解它的意思,估計這個問題與resource的id相關
處理後就可以正常執行。

註:這個問題可能與resource的id相關,建議優化相關的配置避免以上錯誤


2018年2月19日 星期一

MSSQL檔案壓縮

如果想要節省資料表空間,或是有些情況有容量限制的時候可以壓縮資料表

右鍵 > 工作 > 壓縮 > 檔案



這個畫面按確定就能壓縮,依照檔案的大小有可能5分鐘到20分鐘
這是壓縮前的佔用空間



這是壓縮後的佔用空間資訊,可能看到少了1到2G左右的空間

2018年2月18日 星期日

dll檔建置與除錯

1、建置dll檔
檔案 -> 專案 -> 類別庫(如圖)


程式碼範例如下:

範例一是測試的範例
範例二是偵錯的範例,除了藍色的部份要記得加入一個windows form

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace dllfunction
{
    public class Class1
    {
        //範例一,數字相加輸出數字
        public int add(int a, int b)
        {
            int sum = a + b;
            return sum;
        }
        //範例二,字串轉數字後相加後輸出字串
        public string addstr(string strA, string strB)
        {
            int retult = 0;
            try
            {
                retult = int.Parse(strA) + int.Parse(strB);
            }
            catch(Exception ex)
            {
                MessageBox.Show("" + ex.ToString() + " ");
            }
            return "" + retult;
        }
        //
    }
}

程式寫好後建置方案
建置 -> 建置方案



建置成功的訊息:


接下來把dll檔放到要引用的專案目錄下
專案 -> 加入參考 -> 瀏覽(引用dll檔)
照以下綠色段落的方式動態引用
以下是引用的程式碼:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using dllfunction;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        //
        private void button1_Click(object sender, EventArgs e)
        {
            dllfunction.Class1 encode = new dllfunction.Class1();
            button1.Text = "1+2=" + encode.add(1, 2);

        }
        //
        private void button2_Click(object sender, EventArgs e)
        {
            dllfunction.Class1 encode = new dllfunction.Class1();
            button2.Text = "2+3=" + encode.addstr("2", "3");
        }
        //
        private void button3_Click(object sender, EventArgs e)
        {
            dllfunction.Class1 encode = new dllfunction.Class1();
            button3.Text = "3+a=" + encode.addstr("2", "a");
        }
        //
    }
}

然後是輸出結果,
第一個例子:產出int數字,
第二個例子:產出string格式的數字
第三個例子:產生錯誤訊息後輸出0字串 (這是除錯的範例)





本文大致提供建置與除錯dll的方式,就介紹到這邊


2018年1月30日 星期二

[c#][MSSQL]去除單雙引號


這裡的東西很常用到,蒐集整理放在這邊


//c#去單引號
.Replace("'", "");

//c#去雙引號
.Replace(@"""", "");

--sql偵測換行
WHERE charindex(char(10),欄位)>0

--sql偵測單引號
WHERE charindex('''',欄位)>0
WHERE charindex(char(39),欄位)>0

--sql偵測雙引號
WHERE charindex(char(34),欄位)>0

--sql去除雙引號
update 資料表
set 欄位 = REPLACE (欄位, char(34), '')
WHERE charindex(char(34),欄位) > 0


2018年1月24日 星期三

android google map自訂圖示

android google map自訂圖示

1、用android開一個新的map原生碼的程式
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

import com.google.android.gms.maps.model.BitmapDescriptorFactory;
>>其中這個最重要



2、以下是參考寫法
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
LatLng sydney = new LatLng(-34, 151);
mMap.addMarker(new MarkerOptions().position(sydney)
.title("測試")
.icon(BitmapDescriptorFactory.fromResource(R.drawable.z2))
);
mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
}


以下是程式碼的執行結果:(假設圖片是18X18放在drawable的z2.png檔案)


2018年1月15日 星期一

[MSSQL]建立空間索引


1、右鍵新增索引 > 空間索引



2、以下的畫面,加入鍵可以新增索引


3、點上圖左邊的空間選項,把X-min的數值為-180,Y-min為-180,其他為180就可以建立空間索引

[c#]程式執行時間

這個很常見因此整理在這邊:


DateTime time_start = DateTime.Now;//計時開始 取得目前時間
程式區段

DateTime time_end = DateTime.Now;//結束時間
string resultTime = ((TimeSpan)(time_end - time_start)).TotalMilliseconds.ToString();//總時間
double result_time = double.Parse(resultTime) / icount;//平均時間