Androidで呼び出しシステム権限を適用


現在、設備の安全性はますます重視され、それに伴って開発中の様々な不便、例えば普通の権限、運行時の権限、システムの権限の区別がある.ランタイム権限の追加は参照できます
Androidの各権限の意味についてはandroid/frameworks/base/core/res/Android Manifestを参照してください.xmlの意味
Android6.0 Bluetooth開発における近隣の低消費電力Bluetoothデバイスの取得結果権限の問題分析
システム権限については、良いソリューションはありません.しばらくは特定のソリューションしかありません.
転載は出典を明記してください.
海天の青
のブログ
Androidで呼び出しシステム権限を適用
chapter oneシステムアプリケーションシステム権限の追加
ソースコードにコンパイルできるapkにシステム権限を追加するのは簡単です.
一つはandroidmanifestです.xmlファイルにuidを追加すると、systemプロセスにアプリケーションを走らせる:android:sharduserid=""
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.fang.zrf.networkdemo"
    android:sharedUserId="android.uid.system">

二、アプリケーションのmkファイルに署名を追加する、すなわち、アプリケーションにシステム署名を使用させる
LOCAL_CERTIFICATE := platform

ここでplatformに対応する署名ファイルの位置はandroid/build/target/product/security platformである.pk 8とplatform.x509.pem
次にコンパイルコマンドを使用してapkをコンパイルします.
しかし、mkのアプリケーションがなければどうすればいいのでしょうか.
実は1つのアプリケーションにシステム権限を使用させるのは2つのステップにすぎないとまとめることができます.
1つ目はuidをsystemに変更することです2つ目はシステムの署名を使用することです.これらを理解したら、アプリケーションにシステム権限を使用することができます.
chapter two三方アプリケーションシステム権限の追加
最初のステップと同様に、Android:shareduseridプロパティを追加します.
第2のステップでは、パッケージされたapkをシステム署名を使用して再署名してパッケージ化します.署名パッケージAndroidソースコードに付属のツールsignapkと呼ばれ、ディレクトリはAndroid/out/host/linux-x 86/frameworkです.
cmdコマンドを使用してjava-jar signapkを再署名パッケージ.jar platform.x509.pem platform.pk8 old.apk new.apk
そのうちold.apkはパッケージされたapkでnew.apkは再署名されたapkです.次にadb install-r newを用いることができる.apkはアプリケーションを携帯電話にインストールし、システム権限を取得します.しかし、システムの署名を使用している以上、まずあなたのアプリケーションのシステム署名と携帯電話のシステム署名が一致することを保証しなければならない条件があります.これは各メーカーが変更する可能性があるので、あまり互換性がありません.
chapter three DEMO実装
さあ、こんなにたくさん言ったから、demoを見てみましょう.demoが実現する機能は3つあり、
一つは携帯電話のモバイルネットワークを開くことです
二つ目は携帯電話のモバイルネットワークを閉鎖することです
三つ目は携帯電話のモバイルネットワークを取得することです
実はまとめてみると、携帯電話のモバイルネットワークのsetとgetの2つの機能です.ソースコード上でsetとgetに対する方法はhideに属し、サードパーティアプリケーションでは使用されないので、反射を利用して呼び出すことができます.
まず、どのような権限が必要かを見てみましょう.
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.MODIFY_PHONE_STATE"/>

ここでMODIFY_PHONE_STATEはシステム権限なので、chapter twoに示すようにするしかありません.コードを完了してapkを生成してから再署名します.
続いて携帯電話のモバイルネットワークが設置された状態
public static void setMobileDataState(Context context, boolean enable){
        Class[] argsClass = new Class[1];
        argsClass[0] = boolean.class;//setmobiledataenable        boolean     
        ConnectivityManager connMr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        try {
            Method method = connMr.getClass().getMethod("setMobileDataEnabled",argsClass);

            method.invoke(connMr,enable);
        } catch (Exception e) {
            e.printStackTrace();
            Toast.makeText(context,"set failure + e = " + e.getCause(),Toast.LENGTH_LONG).show();
        }
    }

そして携帯電話のモバイルネットワークを取得した状態
public static boolean getMobileDataState(Context context){

        ConnectivityManager connMr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

        Class[] argsclass = null;//get        ,        null     
        try {
            Method method = connMr.getClass().getDeclaredMethod("getMobileDataEnabled",argsclass);
            return (boolean)method.invoke(connMr);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

次はインタフェース設計の方法の呼び出しです.
まずインタフェースの実装効果を見てみましょう
                
public class MainActivity extends Activity implements View.OnClickListener{


    private TextView mOpenNet;
    private TextView mCloseNet;
    private TextView mGetNetState;
    private TextView mNetState;

    private boolean isOpenState;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView();
        initData();
    }


    /**
     *    view
     */
    private void initView(){
        mOpenNet = (TextView) findViewById(R.id.open_network);
        mCloseNet = (TextView) findViewById(R.id.close_network);
        mGetNetState = (TextView) findViewById(R.id.get_state);
        mNetState = (TextView) findViewById(R.id.network_state);
        setClickListener(mOpenNet,mCloseNet,mGetNetState);
    }


    /**
     *      
     */
    private void initData(){
        updateView();

    }

    /**
     *   view     
     * @param views
     */
    private void setClickListener(View...views){

        for (View view:views) {
            if (view != null){
                view.setOnClickListener(this);
            }
        }

    }
    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.open_network:
                NetManager.setMobileDataState(getApplicationContext(),true);
                updateView();
                break;
            case R.id.close_network:
                NetManager.setMobileDataState(getApplicationContext(),false);
                updateView();
                break;
            case R.id.get_state:
                updateView();
                break;
            default:
                break;
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        updateView();
    }

    private void updateView(){
        isOpenState = NetManager.getMobileDataState(getApplicationContext());
        String str = isOpenState ? "true" : "false";
        if (str.equals(mNetState.getText().toString())){
            return;
        }
        mNetState.setText(str);
        setTvEnable(!isOpenState,isOpenState);
    }

    private void setTvEnable(boolean setEnable,boolean closeEnable){
        mOpenNet.setEnabled(setEnable);
        mCloseNet.setEnabled(closeEnable);
    }
}

コードが完了したら、outputsディレクトリの下にapkファイルを見つけてcmdコマンドを使用して再署名します.
これで終わります
もし問題があれば、学習交流を歓迎して、微信の公衆番号---fanfan程序媛