ぴよログ

↓に移転したのでこっちは更新されません、多分。

Android端末の写真をコードから削除する

移転しました →

Android触り始めました。さすがに初めてすぎて全然わかんない。

iOSと違ってAndroidでは公式ではないアプリが写真を削除することができるらしいということでサンプルを書いてためしてみました。

下のコードでは

  1. ギャラリーを開いて
  2. 写真を選択して
  3. ContentResolver::deleteURI渡しで削除
public class MainActivity extends ActionBarActivity {

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

        // ボタンクリックで写真選択へ
        Button b = (Button)findViewById(R.id.button_open);
        b.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.setType("image/*");
                intent.setAction(Intent.ACTION_PICK);
                startActivityForResult(intent, 0);
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == 0 && resultCode == RESULT_OK) {
            try {
                getContentResolver().delete(data.getData(), null, null);
            } catch (Exception e){
                Log.d("MainActivity", e.getMessage());
            }
        }
    }
}

でもこれだけでは削除は完了しません。

例外キャッチ時のメッセージを適当な"Fail"みたいなメッセージにしていたせいで全然気が付かなかったんですが、ちゃんと例外メッセージを出したらこんなん↓が出てました。

writing com.android.providers.media.MediaProvider uri content://media/external/images/media/1368
from pid=27267, uid=10071 requires android.permission.WRITE_EXTERNAL_STORAGE, or grantUriPermission()

パーミッションが足りないらしい。

ということでAndroidManifest.xmlパーミッションに関して追記することで削除ができるようになりました。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com....." >
    <application>
        ...
    </application>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
</manifest>

多分パーミッションの設定自体Android開発では当たり前のことなんでしょうね。誰も言及してないし。