タブレット用プログラムの書き止め

android OS & iPadOS の記録。

基礎。複数の指定ディレクトリの切り替え。

2022-06-11 15:41:54 | Android studio 日記

android studio アップデートされました。2021.2.1 なんのトラブルもなく良かった。

ディレクトリのアクセスについて。

新しいOSほどセキュリティの都合で“File.listFiles()”を使い、自由にアイテムを取得できないから、
アクセスの許されたディレクトリを設定して、その親ディレクトリへの移動を禁止させて運用する。

OS毎に対応も面倒だし、閲覧場所を固定してボタンで切り替え…。
まぁ仕方ない。

 

内容
・設定の基本ディレクトリの中では自由に移動できる事。
・親ディレクトリへ移動の前に毎回ディレクトリの検査を行い、移動禁止判定を下す事。

 

public class MyDirectory {

    private ImageView mPicturesButton = null; // 設定は省略。タップ処理設定も省略。
    private ImageView mDcimButton = null;
    private ImageView mRemovableButton = null;// MainActivity で設定する体で

    private View.OnClickListener mPicturesButtonClick = null;
    private View.OnClickListener mDcimButtonClick = null;
    private View.OnClickListener mRemovableButtonClick = null;

 

    private final Handler mHandler = new Handler();// ボタンアニメーション用

    MyDirectory( MyMainData mainData ) {

        mPicturesButtonClick = new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if ( mMainData.isStandBy() ) return;// 処理中に再度タップされたら戻る
                mMainData.setStandBy(true);// 処理中を設定
                mMainData.touchActionB( v );// アニメーション実行

                mHandler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        changeDirectoryBase(0);
                        mMainData.setStandBy(false);// 処理完了
                    }
                }, 400);// アニメーションが終わった頃に実行する
            }
        };
        mDcimButtonClick = new View.OnClickListener() { 省略 };
        mRemovableButtonClick = new View.OnClickListener() { 省略 };

    }


    private void changeDirectoryBase( int no ) {
        if ( mMainData.getTargetDirectoryBase() == null ) return;

        File dir;
        switch ( no ) {
            case 1:
                dir = getExternalStoragePublicDirectory( DIRECTORY_DCIM );
                break;
            case 2:
                dir = new File("/Removable");
                break;
            default:
                dir = getExternalStoragePublicDirectory( DIRECTORY_PICTURES );
        }
        if ( mMainData.isEqualBase( dir ) ) return;

        if ( setDirectoryList( dir ) == 0 )// **
            mMainData.setTargetDirectoryBase( dir );
    }
/*

** setDirectoryList()は設定ディレクトリボタンをタップしたときに新たなファイルアイテムを取得するメソッド。
正常に終了したら、0を返す。そして、基本ディレクトリ情報をセットする。

*/

 

    public void setPicturesButtonView(ImageView Pic) { mPicturesButton = Pic; }
// mDcimButton、mRemovableButton 省略

    public ImageView getPicturesButtonView() { return mPicturesButton; }
// mDcimButtonClick、mRemovableButton 省略

    public View.OnClickListener getPicturesButtonClickListener() { return mPicturesButtonClick; }
// mDcimButton、mRemovableButtonClick 省略

}

 

他のクラスで参照しやすいようにまとめる。

・現在対象の基本ディレクトリを保存。
・表示ディレクトリが基本ディレクトリか調べる。
・表示ディレクトリ、対象アイテムは、どの設定されている基本ディレクトリの系列か調べる。

public class MyMainData {

    private Context mContext;
    MyMainData(Context c) {
        mContext = c;
        // 必要な処理を書く
    }
    private boolean mAllWaitFlag = false;

    public boolean isStandBy() { return mAllWaitFlag; }
    public void setStandBy( boolean flag ) { mAllWaitFlag = flag; }


    private File mTargetDirectoryBase = null;

    public File getTargetDirectoryBase() { return mTargetDirectoryBase; }

    public boolean setTargetDirectoryBase( File dir ) {
        if ( !dir.exists() ) {
            mTargetDirectoryBase = getExternalStoragePublicDirectory(DIRECTORY_PICTURES);
            return false;
        }

        mTargetDirectoryBase = dir;
        return true;
    }

    public boolean isEqualBase( File dir ) {
        if ( !dir.exists() || !dir.isDirectory() ) return false;
        return isEqualBase( dir.getAbsolutePath() );
    }

    public boolean isEqualBase( String path ) {
        return path.equals( mTargetDirectoryBase.getAbsolutePath() );
    }


    public File isContainsPath( File dir ) {
        if ( !dir.exists() || !dir.isDirectory() ) return null;
        return isContainsPath( dir.getAbsolutePath() );
    }

    public File isContainsPath( String path ) {
        File dir = getExternalStoragePublicDirectory( DIRECTORY_PICTURES );
        if ( path.startsWith( dir.getAbsolutePath() ) ) return dir;

        dir = getExternalStoragePublicDirectory( DIRECTORY_DCIM );
        if ( path.startsWith( dir.getAbsolutePath() ) ) return dir;

        if ( path.startsWith( "/Removable" ) ) return new File("/Removable");

        return null;
    }

    private final Handler mHandler1 = new Handler();
    private final Handler mHandler2 = new Handler();

    public void touchActionB( View view ) {
        mHandler1.post( new Runnable() {
            @Override
            public void run(){
                view.startAnimation( AnimationUtils.loadAnimation( mContext, R.anim.scale_down_animation_set) );
            }
        } );
        mHandler2.postDelayed( new Runnable() {
            @Override
            public void run(){
                view.startAnimation( AnimationUtils.loadAnimation( mContext, R.anim.scale_up_animation_set) );
            }
        },160 );// mHandler1が終わった頃に開始

    }
}

public class MainActivity extends AppCompatActivity {

    private MyMainData mainData;
    private MyDirectory mDirectory;

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

色々省略
        mainData = new MyMainData( this );
        mDirectory = new MyDirectory(mainData);

        ImageView iv = findViewById(R.id.pictures_button);// activity_main.xml設定は説明省略

        mDirectory.setPicturesButtonView( iv );
        iv.setOnClickListener(mDirectory.getPicturesButtonClickListener());

        // 他のボタン省略

    }
}